Merge "Add tests to validate private interface function in Kotlin are ignored." 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/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
index d51f9f5..ff9df4f 100644
--- a/activity/activity-compose/api/1.7.0-beta01.txt
+++ b/activity/activity-compose/api/1.7.0-beta01.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/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.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
index d51f9f5..ff9df4f 100644
--- 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
@@ -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-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-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
index d51f9f5..ff9df4f 100644
--- a/activity/activity-compose/api/restricted_1.7.0-beta01.txt
+++ b/activity/activity-compose/api/restricted_1.7.0-beta01.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/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.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-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 1b633a6..1c56f4f 100644
--- a/activity/activity-ktx/api/current.ignore
+++ b/activity/activity-ktx/api/current.ignore
@@ -1,7 +1,3 @@
 // Baseline format: 1.0
-RemovedClass: androidx.activity.OnBackPressedDispatcherKt:
-    Removed class androidx.activity.OnBackPressedDispatcherKt
-
-
-RemovedPackage: androidx.activity.contextaware:
-    Removed package androidx.activity.contextaware
+RemovedClass: androidx.activity.PipHintTrackerKt:
+    Removed class androidx.activity.PipHintTrackerKt
diff --git a/activity/activity-ktx/api/current.txt b/activity/activity-ktx/api/current.txt
index a1c4a4d..4023c72 100644
--- a/activity/activity-ktx/api/current.txt
+++ b/activity/activity-ktx/api/current.txt
@@ -6,9 +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.result {
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/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-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 1b633a6..1c56f4f 100644
--- a/activity/activity-ktx/api/restricted_current.ignore
+++ b/activity/activity-ktx/api/restricted_current.ignore
@@ -1,7 +1,3 @@
 // Baseline format: 1.0
-RemovedClass: androidx.activity.OnBackPressedDispatcherKt:
-    Removed class androidx.activity.OnBackPressedDispatcherKt
-
-
-RemovedPackage: androidx.activity.contextaware:
-    Removed package androidx.activity.contextaware
+RemovedClass: androidx.activity.PipHintTrackerKt:
+    Removed class androidx.activity.PipHintTrackerKt
diff --git a/activity/activity-ktx/api/restricted_current.txt b/activity/activity-ktx/api/restricted_current.txt
index a1c4a4d..4023c72 100644
--- a/activity/activity-ktx/api/restricted_current.txt
+++ b/activity/activity-ktx/api/restricted_current.txt
@@ -6,9 +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.result {
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-beta02.txt b/activity/activity/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..4bbcdbb
--- /dev/null
+++ b/activity/activity/api/1.7.0-beta02.txt
@@ -0,0 +1,420 @@
+// 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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
+  }
+
+  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.ignore b/activity/activity/api/current.ignore
deleted file mode 100644
index 149cb0c..0000000
--- a/activity/activity/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.activity.result.IntentSenderRequest#CREATOR:
-    Field androidx.activity.result.IntentSenderRequest.CREATOR has changed type from android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> to android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest>
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index bf98034..4bbcdbb 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -319,7 +319,9 @@
     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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
     field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
   }
 
   public static final class ActivityResultContracts.PickVisualMedia.Companion {
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..4bbcdbb
--- /dev/null
+++ b/activity/activity/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,420 @@
+// 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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
+  }
+
+  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 bf98034..4bbcdbb 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -319,7 +319,9 @@
     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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
     field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
   }
 
   public static final class ActivityResultContracts.PickVisualMedia.Companion {
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-beta02.txt b/activity/activity/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..2997940
--- /dev/null
+++ b/activity/activity/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,419 @@
+// 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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
+  }
+
+  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.ignore b/activity/activity/api/restricted_current.ignore
deleted file mode 100644
index 149cb0c..0000000
--- a/activity/activity/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.activity.result.IntentSenderRequest#CREATOR:
-    Field androidx.activity.result.IntentSenderRequest.CREATOR has changed type from android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> to android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest>
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 7561e11..2997940 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -318,7 +318,9 @@
     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 String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
     field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
   }
 
   public static final class ActivityResultContracts.PickVisualMedia.Companion {
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index 821f0d8..520cb87 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -26,6 +26,7 @@
     api(project(":lifecycle:lifecycle-viewmodel"))
     api("androidx.savedstate:savedstate:1.2.0")
     api(project(":lifecycle:lifecycle-viewmodel-savedstate"))
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
     implementation("androidx.tracing:tracing:1.0.0")
     api(libs.kotlinStdlib)
 
diff --git a/activity/activity/src/androidTest/java/androidx/activity/FullyDrawnReporterTest.kt b/activity/activity/src/androidTest/java/androidx/activity/FullyDrawnReporterTest.kt
index 1562394..3d303a23 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/FullyDrawnReporterTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/FullyDrawnReporterTest.kt
@@ -92,12 +92,12 @@
                     }
                 }
                 delay(1L)
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isFalse()
                 }
                 mutex.unlock()
                 delay(1L)
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isTrue()
                 }
             }
@@ -112,11 +112,11 @@
             fullyDrawnReporter.addReporter()
             fullyDrawnReporter.removeReporter()
 
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(fullyDrawnReported).isFalse()
             }
             fullyDrawnReporter.removeReporter()
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(fullyDrawnReported).isTrue()
             }
         }
@@ -138,12 +138,12 @@
                 delay(1L) // wait for launch
                 fullyDrawnReporter.removeReporter()
 
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isFalse()
                 }
                 mutex.unlock()
                 delay(1L) // allow launch to continue
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isTrue()
                 }
             }
@@ -166,12 +166,12 @@
                 delay(1L) // wait for launch
                 mutex.unlock()
                 delay(1L) // allow launch to continue
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isFalse()
                 }
 
                 fullyDrawnReporter.removeReporter()
-                waitForPostAnimation {
+                waitForOnDrawComplete {
                     assertThat(fullyDrawnReported).isTrue()
                 }
             }
@@ -197,7 +197,7 @@
             fullyDrawnReporter.addOnReportDrawnListener(reportListener2)
             fullyDrawnReporter.removeOnReportDrawnListener(reportListener2)
             fullyDrawnReporter.removeReporter()
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(report1).isTrue()
                 assertThat(report2).isFalse()
             }
@@ -223,13 +223,13 @@
                 fullyDrawnReporter.removeReporter()
                 fullyDrawnReporter.addReporter()
             }
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(fullyDrawnReporter.isFullyDrawnReported).isFalse()
             }
             onActivity {
                 fullyDrawnReporter.removeReporter()
             }
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(fullyDrawnReporter.isFullyDrawnReported).isTrue()
             }
         }
@@ -254,35 +254,41 @@
                 OneShotPreDrawListener.add(activity.window.decorView) {
                     fullyDrawnInOnPreDraw = fullyDrawnReporter.isFullyDrawnReported
                 }
-                val onDrawListener = OnDrawListener {
-                    fullyDrawnInOnDraw = fullyDrawnReporter.isFullyDrawnReported
+                val onDrawListener = object : OnDrawListener {
+                    override fun onDraw() {
+                        fullyDrawnInOnDraw = fullyDrawnReporter.isFullyDrawnReported
+                        activity.window.decorView.post {
+                            activity.window.decorView.viewTreeObserver.removeOnDrawListener(this)
+                        }
+                    }
                 }
                 activity.window.decorView.viewTreeObserver.addOnDrawListener(onDrawListener)
-                activity.window.decorView.post {
-                    activity.window.decorView.viewTreeObserver.removeOnDrawListener(onDrawListener)
-                }
             }
-            waitForPostAnimation {
+            waitForOnDrawComplete {
                 assertThat(fullyDrawnInOnPreDraw).isFalse()
                 assertThat(fullyDrawnInOnDraw).isTrue()
             }
         }
     }
 
-    private fun ActivityScenario<FullyDrawnActivity>.waitForPostAnimation(
+    private fun ActivityScenario<FullyDrawnActivity>.waitForOnDrawComplete(
         block: FullyDrawnActivity.() -> Unit = {}
     ) {
         val countDownLatch = CountDownLatch(1)
+        val observer = OnDrawListener {
+            countDownLatch.countDown()
+        }
         withActivity {
             runOnUiThread {
-                window.decorView.postOnAnimation {
-                    countDownLatch.countDown()
-                }
+                window.decorView.viewTreeObserver.addOnDrawListener(observer)
                 window.decorView.invalidate()
             }
         }
         assertThat(countDownLatch.await(10, TimeUnit.SECONDS)).isTrue()
         withActivity {
+            runOnUiThread {
+                window.decorView.viewTreeObserver.removeOnDrawListener(observer)
+            }
             block()
         }
     }
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 3b737e0..ed0c940 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
@@ -32,8 +32,11 @@
 import androidx.activity.result.IntentSenderRequest
 import androidx.activity.result.PickVisualMediaRequest
 import androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.Companion.getClipDataUris
+import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion.ACTION_SYSTEM_FALLBACK_PICK_IMAGES
 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.PickVisualMedia.Companion.getSystemFallbackPicker
 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
@@ -607,8 +610,21 @@
     }
 
     /**
-     * An [ActivityResultContract] to use the photo picker through [MediaStore.ACTION_PICK_IMAGES]
-     * when available, and else rely on ACTION_OPEN_DOCUMENT.
+     * An [ActivityResultContract] to use the
+     * [Photo Picker](https://developer.android.com/training/data-storage/shared/photopicker)
+     * to select a single image, video, or other type of visual media.
+     *
+     * This contract always prefers the system framework provided Photo Picker available via
+     * [MediaStore.ACTION_PICK_IMAGES] when it is available, but will also provide a fallback
+     * on devices that it is not available to ensure a consistent API surface across all
+     * Android API 19 or higher devices.
+     *
+     * The priority order for handling the Photo Picker is:
+     * 1. The system framework provided [MediaStore.ACTION_PICK_IMAGES].
+     * - An OEM can provide a system app that implements [ACTION_SYSTEM_FALLBACK_PICK_IMAGES] to
+     * provide a consistent Photo Picker to older devices.
+     * - [Intent.ACTION_OPEN_DOCUMENT] is used as a final fallback on all Android API 19 or
+     * higher devices.
      *
      * The input is a [PickVisualMediaRequest].
      *
@@ -623,13 +639,15 @@
         companion object {
             /**
              * Check if the current device has support for the photo picker by checking the running
-             * Android version or the SDK extension version (not including the picker
-             * provided by Google Play services)
+             * Android version or the SDK extension version.
+             *
+             * Note that this does not check for any Intent handled by
+             * [ACTION_SYSTEM_FALLBACK_PICK_IMAGES].
              */
             @SuppressLint("ClassVerificationFailure", "NewApi")
             @Deprecated(
                 message = "This method is deprecated in favor of isPhotoPickerAvailable(context) " +
-                    "to support the picker provided by Google Play services",
+                    "to support the picker provided by updatable system apps",
                 replaceWith = ReplaceWith("isPhotoPickerAvailable(context)")
             )
             @JvmStatic
@@ -637,6 +655,37 @@
                 return isSystemPickerAvailable()
             }
 
+            /**
+             * In cases where the system framework provided [MediaStore.ACTION_PICK_IMAGES]
+             * Photo Picker cannot be implemented, OEMs or system apps can provide a consistent
+             * Photo Picker experience to those devices by creating an Activity that handles
+             * this action. This app must also include [Intent.CATEGORY_DEFAULT] in the activity's
+             * intent filter.
+             *
+             * Only system apps can implement this action - any non-system apps will be ignored
+             * when searching for the activities that handle this Intent.
+             *
+             * Note: this should not be used directly, instead relying on the selection logic
+             * done by [createIntent] to create the correct Intent for the current device.
+             */
+            @Suppress("ActionValue") /* Don't include SYSTEM_FALLBACk in the action */
+            const val ACTION_SYSTEM_FALLBACK_PICK_IMAGES =
+                "androidx.activity.result.contract.action.PICK_IMAGES"
+
+            /**
+             * Extra that will be sent by [PickMultipleVisualMedia] to an Activity that handles
+             * [ACTION_SYSTEM_FALLBACK_PICK_IMAGES] that indicates that maximum number of photos
+             * the user should select.
+             *
+             * If this extra is not present, only a single photo should be selectable.
+             *
+             * If this extra is present but equal to [Int.MAX_VALUE], then no limit should
+             * be enforced.
+             */
+            @Suppress("ActionValue") /* Don't include SYSTEM_FALLBACk in the extra */
+            const val EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX =
+                "androidx.activity.result.contract.extra.PICK_IMAGES_MAX"
+
             internal const val GMS_ACTION_PICK_IMAGES =
                 "com.google.android.gms.provider.action.PICK_IMAGES"
             internal const val GMS_EXTRA_PICK_IMAGES_MAX =
@@ -644,19 +693,22 @@
 
             /**
              * Check if the current device has support for the photo picker by checking the running
-             * Android version, the SDK extension version or the picker provided by Google Play
-             * services
+             * Android version, the SDK extension version or the picker provided by
+             * a system app implementing [ACTION_SYSTEM_FALLBACK_PICK_IMAGES].
              */
             @SuppressLint("ClassVerificationFailure", "NewApi")
             @JvmStatic
             fun isPhotoPickerAvailable(context: Context): Boolean {
-                return isSystemPickerAvailable() || isGmsPickerAvailable(context)
+                return isSystemPickerAvailable() || isSystemFallbackPickerAvailable(context) ||
+                    isGmsPickerAvailable(context)
             }
 
             /**
-             * Check if the current device has support for the Android photo picker by checking the
-             * running Android version or the SDK extension version (not including the picker
-             * provided by Google Play services)
+             * Check if the current device has support for the system framework provided photo
+             * picker by checking the running Android version or the SDK extension version.
+             *
+             * Note that this does not check for any Intent handled by
+             * [ACTION_SYSTEM_FALLBACK_PICK_IMAGES].
              */
             @SuppressLint("ClassVerificationFailure", "NewApi")
             @JvmStatic
@@ -673,6 +725,20 @@
             }
 
             @JvmStatic
+            internal fun isSystemFallbackPickerAvailable(context: Context): Boolean {
+                return getSystemFallbackPicker(context) != null
+            }
+
+            @Suppress("DEPRECATION")
+            @JvmStatic
+            internal fun getSystemFallbackPicker(context: Context): ResolveInfo? {
+                return context.packageManager.resolveActivity(
+                    Intent(ACTION_SYSTEM_FALLBACK_PICK_IMAGES),
+                    PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
+                )
+            }
+
+            @JvmStatic
             internal fun isGmsPickerAvailable(context: Context): Boolean {
                 return getGmsPicker(context) != null
             }
@@ -729,6 +795,12 @@
                 Intent(MediaStore.ACTION_PICK_IMAGES).apply {
                     type = getVisualMimeType(input.mediaType)
                 }
+            } else if (isSystemFallbackPickerAvailable(context)) {
+                val fallbackPicker = checkNotNull(getSystemFallbackPicker(context)).activityInfo
+                Intent(ACTION_SYSTEM_FALLBACK_PICK_IMAGES).apply {
+                    setClassName(fallbackPicker.applicationInfo.packageName, fallbackPicker.name)
+                    type = getVisualMimeType(input.mediaType)
+                }
             } else if (isGmsPickerAvailable(context)) {
                 val gmsPicker = checkNotNull(getGmsPicker(context)).activityInfo
                 Intent(GMS_ACTION_PICK_IMAGES).apply {
@@ -768,12 +840,27 @@
     }
 
     /**
-     * An [ActivityResultContract] to use the Photo Picker through [MediaStore.ACTION_PICK_IMAGES]
-     * when available, and else rely on ACTION_OPEN_DOCUMENT.
+     * An [ActivityResultContract] to use the
+     * [Photo Picker](https://developer.android.com/training/data-storage/shared/photopicker)
+     * to select a single image, video, or other type of visual media.
      *
-     * The constructor accepts one parameter `maxItems` to limit the number of selectable items when
-     * using the photo picker to return. Keep in mind that this parameter isn't supported on devices
-     * when the photo picker isn't available.
+     * This contract always prefers the system framework provided Photo Picker available via
+     * [MediaStore.ACTION_PICK_IMAGES] when it is available, but will also provide a fallback
+     * on devices that it is not available to provide a consistent API surface across all
+     * Android API 19 or higher devices.
+     *
+     * The priority order for handling the Photo Picker is:
+     * 1. The system framework provided [MediaStore.ACTION_PICK_IMAGES].
+     * - An OEM can provide a system app that implements
+     * [PickVisualMedia.ACTION_SYSTEM_FALLBACK_PICK_IMAGES] to provide a consistent Photo Picker
+     * to older devices. These system apps may handle the
+     * [PickVisualMedia.EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX] extra to respect the
+     * [maxItems] passed to this contract.
+     * - [Intent.ACTION_OPEN_DOCUMENT] is used as a final fallback on all Android API 19 or
+     * higher devices. This Intent does not allow limiting the max items the user selects.
+     *
+     * The constructor accepts one parameter [maxItems] to limit the number of selectable items when
+     * using the photo picker to return.
      *
      * The input is a [PickVisualMediaRequest].
      *
@@ -807,11 +894,19 @@
 
                     putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxItems)
                 }
-            } else if (PickVisualMedia.isGmsPickerAvailable(context)) {
-                Intent(GMS_ACTION_PICK_IMAGES).apply {
+            } else if (PickVisualMedia.isSystemFallbackPickerAvailable(context)) {
+                val fallbackPicker = checkNotNull(getSystemFallbackPicker(context)).activityInfo
+                Intent(ACTION_SYSTEM_FALLBACK_PICK_IMAGES).apply {
+                    setClassName(fallbackPicker.applicationInfo.packageName, fallbackPicker.name)
                     type = PickVisualMedia.getVisualMimeType(input.mediaType)
                     putExtra(GMS_EXTRA_PICK_IMAGES_MAX, maxItems)
                 }
+            } else if (PickVisualMedia.isGmsPickerAvailable(context)) {
+                val gmsPicker = checkNotNull(getGmsPicker(context)).activityInfo
+                Intent(GMS_ACTION_PICK_IMAGES).apply {
+                    setClassName(gmsPicker.applicationInfo.packageName, gmsPicker.name)
+                    putExtra(GMS_EXTRA_PICK_IMAGES_MAX, maxItems)
+                }
             } else {
                 // For older devices running KitKat and higher and devices running Android 12
                 // and 13 without the SDK extension that includes the Photo Picker, rely on the
@@ -846,8 +941,8 @@
             /**
              * The system photo picker has a maximum limit of selectable items returned by
              * [MediaStore.getPickImagesMaxLimit()]
-             * On devices supporting picker provided by Google Play services, the limit is ignored
-             * if it's higher than the allowed limit.
+             * On devices supporting picker provided via [ACTION_SYSTEM_FALLBACK_PICK_IMAGES],
+             * the limit may be ignored if it's higher than the allowed limit.
              * On devices not supporting the photo picker, the limit is ignored.
              *
              * @see MediaStore.EXTRA_PICK_IMAGES_MAX
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/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/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..2fccf45 100644
--- a/appactions/interaction/interaction-capabilities-core/build.gradle
+++ b/appactions/interaction/interaction-capabilities-core/build.gradle
@@ -20,31 +20,41 @@
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
+    api(libs.kotlinStdlib)
     api(libs.autoValueAnnotations)
+    api(libs.kotlinStdlib)
     annotationProcessor(libs.autoValue)
     implementation(libs.protobufLite)
     implementation(libs.guavaListenableFuture)
+    implementation(libs.kotlinCoroutinesGuava)
     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)
     testImplementation(libs.mockitoCore)
+    testImplementation(libs.mockitoKotlin4)
     testImplementation(libs.kotlinStdlib)
     testImplementation(libs.androidLint)
     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/AbstractCapabilityBuilder.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/AbstractCapabilityBuilder.java
index a7c0999..44762184 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/AbstractCapabilityBuilder.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/AbstractCapabilityBuilder.java
@@ -18,13 +18,14 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appactions.interaction.capabilities.core.impl.spec.ActionCapabilityImpl;
+import androidx.appactions.interaction.capabilities.core.impl.SingleTurnCapabilityImpl;
 import androidx.appactions.interaction.capabilities.core.impl.spec.ActionSpec;
 import androidx.appactions.interaction.capabilities.core.task.impl.AbstractTaskUpdater;
 import androidx.appactions.interaction.capabilities.core.task.impl.TaskCapabilityImpl;
 
+import com.google.common.util.concurrent.ListenableFuture;
+
 import java.util.Objects;
-import java.util.Optional;
 
 /**
  * An abstract Builder class for ActionCapability.
@@ -39,7 +40,12 @@
 public abstract class AbstractCapabilityBuilder<
         BuilderT extends
                 AbstractCapabilityBuilder<
-                        BuilderT, PropertyT, ArgumentT, OutputT, ConfirmationT, TaskUpdaterT>,
+                                BuilderT,
+                                PropertyT,
+                                ArgumentT,
+                                OutputT,
+                                ConfirmationT,
+                                TaskUpdaterT>,
         PropertyT,
         ArgumentT,
         OutputT,
@@ -47,14 +53,10 @@
         TaskUpdaterT extends AbstractTaskUpdater> {
 
     private final ActionSpec<PropertyT, ArgumentT, OutputT> mActionSpec;
-    @Nullable
-    private String mId;
-    @Nullable
-    private PropertyT mProperty;
-    @Nullable
-    private ActionExecutor<ArgumentT, OutputT> mActionExecutor;
-    @Nullable
-    private TaskHandler<ArgumentT, OutputT, ConfirmationT, TaskUpdaterT> mTaskHandler;
+    @Nullable private String mId;
+    @Nullable private PropertyT mProperty;
+    @Nullable private ActionExecutor<ArgumentT, OutputT> mActionExecutor;
+    @Nullable private TaskHandler<ArgumentT, OutputT, ConfirmationT, TaskUpdaterT> mTaskHandler;
 
     /**
      * @param actionSpec
@@ -90,10 +92,9 @@
 
     /**
      * Sets the TaskHandler for this capability. The individual capability factory classes can
-     * decide
-     * to expose their own public {@code setTaskHandler} method and invoke this parent method.
-     * Setting
-     * the TaskHandler should build a capability instance that supports multi-turn tasks.
+     * decide to expose their own public {@code setTaskHandler} method and invoke this parent
+     * method. Setting the TaskHandler should build a capability instance that supports multi-turn
+     * tasks.
      */
     protected final BuilderT setTaskHandler(
             @NonNull TaskHandler<ArgumentT, OutputT, ConfirmationT, TaskUpdaterT> taskHandler) {
@@ -115,22 +116,31 @@
         Objects.requireNonNull(mProperty, "property must not be null.");
         if (mTaskHandler == null) {
             Objects.requireNonNull(mActionExecutor, "actionExecutor must not be null.");
-            return new ActionCapabilityImpl<>(
-                    mActionSpec, Optional.ofNullable(mId), mProperty, mActionExecutor);
+            return new SingleTurnCapabilityImpl<PropertyT, ArgumentT, OutputT>(
+                    mId,
+                    mActionSpec,
+                    mProperty,
+                    (hostProperties)->new BaseSession<ArgumentT, OutputT>() {
+                        @Override
+                        public ListenableFuture<ExecutionResult<OutputT>> onFinishAsync(
+                                ArgumentT argument) {
+                            return mActionExecutor.execute(argument);
+                        }
+                    });
         }
         TaskCapabilityImpl<PropertyT, ArgumentT, OutputT, ConfirmationT, TaskUpdaterT>
                 taskCapability =
-                new TaskCapabilityImpl<>(
-                        Objects.requireNonNull(mId, "id field must not be null."),
-                        mActionSpec,
-                        mProperty,
-                        mTaskHandler.getParamsRegistry(),
-                        mTaskHandler.getOnInitListener(),
-                        mTaskHandler.getOnReadyToConfirmListener(),
-                        mTaskHandler.getOnFinishListener(),
-                        mTaskHandler.getConfirmationDataBindings(),
-                        mTaskHandler.getExecutionOutputBindings(),
-                        Runnable::run);
+                        new TaskCapabilityImpl<>(
+                                Objects.requireNonNull(mId, "id field must not be null."),
+                                mActionSpec,
+                                mProperty,
+                                mTaskHandler.getParamsRegistry(),
+                                mTaskHandler.getOnInitListener(),
+                                mTaskHandler.getOnReadyToConfirmListener(),
+                                mTaskHandler.getOnFinishListener(),
+                                mTaskHandler.getConfirmationDataBindings(),
+                                mTaskHandler.getExecutionOutputBindings(),
+                                Runnable::run);
         taskCapability.setTaskUpdaterSupplier(mTaskHandler.getTaskUpdaterSupplier());
         return taskCapability;
     }
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
deleted file mode 100644
index 6e1f4c3..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.java
+++ /dev/null
@@ -1,69 +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;
-
-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;
-
-/**
- * <b>Do not implement this interface yourself.</b>
- *
- * <p>An ActionCapability represents some supported App Action that can be given to App Control.
- *
- * <p>Use helper classes provided by the capability library to get instances of this interface.
- */
-public interface ActionCapability {
-
-    /** 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/ActionCapability.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.kt
new file mode 100644
index 0000000..2325c2a
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.kt
@@ -0,0 +1,87 @@
+/*
+ * 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.annotation.RestrictTo
+import androidx.appactions.interaction.capabilities.core.impl.ActionCapabilitySession
+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
+
+/**
+ * <b>Do not implement this interface yourself.</b>
+ *
+ * <p>An ActionCapability represents some supported App Action that can be given to App Control.
+ *
+ * <p>Use helper classes provided by the capability library to get instances of this interface.
+ */
+interface ActionCapability {
+
+    /** Returns the unique Id of this capability declaration. */
+    val id: String?
+
+    /**
+     * Returns whether or not this capability supports multi-turn task.
+     */
+    val supportsMultiTurnTask: Boolean
+
+    /**
+     * Returns an app action proto describing how to fulfill this capability.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    fun getAppAction(): AppAction
+
+    /**
+     * 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)
+    fun execute(
+        argumentsWrapper: ArgumentsWrapper,
+        callback: CallbackInternal,
+    ) {
+        throw UnsupportedOperationException()
+    }
+
+    /**
+     * 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)
+    fun setTouchEventCallback(callback: TouchEventCallback) {}
+
+    /**
+     * Create a new capability session. The capability library doesn't maintain registry of
+     * capabilities, so it's not going to assign any session id.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    fun createSession(hostProperties: HostProperties): ActionCapabilitySession {
+        throw UnsupportedOperationException()
+    }
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/BaseSession.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/BaseSession.kt
new file mode 100644
index 0000000..e4b20fe
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/BaseSession.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.appactions.interaction.capabilities.core
+
+import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.DelicateCoroutinesApi
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.guava.future
+/**
+ * Base interface for Session of all verticals.
+ */
+interface BaseSession<ArgumentT, OutputT> {
+    /**
+     * Implement any initialization logic.
+     *
+     * This method is called once, before any other listeners are invoked.
+     */
+    fun onInit(initArg: InitArg) {}
+
+    /**
+     * Called when all arguments are finalized.
+     * @param argument the Argument instance containing data for fulfillment.
+     * @return an ExecutionResult instance.
+     */
+    suspend fun onFinish(argument: ArgumentT): ExecutionResult<OutputT> {
+        throw NotImplementedError()
+    }
+
+    /**
+     * Called when all arguments are finalized.
+     * @param argument the Argument instance containing data for fulfillment.
+     * @return a ListenableFuture containing an ExecutionResult instance.
+     */
+    @kotlin.OptIn(DelicateCoroutinesApi::class)
+    fun onFinishAsync(argument: ArgumentT): ListenableFuture<ExecutionResult<OutputT>> {
+        return GlobalScope.future { onFinish(argument) }
+    }
+
+    /**
+     * Implement any cleanup logic.
+     * This method is called some time after the session finishes.
+     */
+    fun onDestroy() {}
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.java
deleted file mode 100644
index 7a9c9c6..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.java
+++ /dev/null
@@ -1,81 +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;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.google.auto.value.AutoValue;
-
-/**
- * Class that represents the response after all slots are filled and accepted and the task is ready
- * to enter the confirmation turn.
- *
- * @param <ConfirmationT>
- */
-@AutoValue
-public abstract class ConfirmationOutput<ConfirmationT> {
-
-    /**
-     * Create a Builder instance for building a ConfirmationOutput instance without confirmation
-     * output.
-     */
-    @NonNull
-    public static Builder<Void> newBuilder() {
-        return new AutoValue_ConfirmationOutput.Builder<>();
-    }
-
-    /** Returns a default ConfirmationOutput instance. */
-    @NonNull
-    public static ConfirmationOutput<Void> getDefaultInstance() {
-        return ConfirmationOutput.newBuilder().build();
-    }
-
-    /** Create a Builder instance for building a ConfirmationOutput instance. */
-    @NonNull
-    public static <ConfirmationT> Builder<ConfirmationT> newBuilderWithConfirmation() {
-        return new AutoValue_ConfirmationOutput.Builder<>();
-    }
-
-    /** Returns a default ConfirmationOutput instance with a confirmation output type. */
-    @NonNull
-    public static <ConfirmationT>
-            ConfirmationOutput<ConfirmationT> getDefaultInstanceWithConfirmation() {
-        return ConfirmationOutput.<ConfirmationT>newBuilderWithConfirmation().build();
-    }
-
-    /** The confirmation output. */
-    @Nullable
-    public abstract ConfirmationT getConfirmation();
-
-    /**
-     * Builder for ConfirmationOutput.
-     *
-     * @param <ConfirmationT>
-     */
-    @AutoValue.Builder
-    public abstract static class Builder<ConfirmationT> {
-
-        /** Sets the confirmation output. */
-        @NonNull
-        public abstract Builder<ConfirmationT> setConfirmation(ConfirmationT confirmation);
-
-        /** Builds and returns the ConfirmationOutput instance. */
-        @NonNull
-        public abstract ConfirmationOutput<ConfirmationT> build();
-    }
-}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.kt
new file mode 100644
index 0000000..acbdcc1
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ConfirmationOutput.kt
@@ -0,0 +1,60 @@
+/*
+ * 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 java.util.Objects
+
+/**
+ * Class that represents the response after all slots are filled and accepted and the task is ready
+ * to enter the confirmation turn.
+ *
+ * @param <ConfirmationT>
+ */
+class ConfirmationOutput<ConfirmationT> internal constructor(val confirmation: ConfirmationT?) {
+    override fun toString() =
+        "ConfirmationOutput(confirmation=$confirmation)"
+
+    override fun equals(other: Any?): Boolean {
+        return other is ConfirmationOutput<*> && confirmation == other.confirmation
+    }
+
+    override fun hashCode() = Objects.hash(confirmation)
+
+    /**
+     * Builder for ConfirmationOutput.
+     *
+     * @param <ConfirmationT>
+     */
+    class Builder<ConfirmationT> {
+        private var confirmation: ConfirmationT? = null
+
+        /** Sets the confirmation output. */
+        fun setConfirmation(confirmation: ConfirmationT) = apply {
+            this.confirmation = confirmation
+        }
+
+        /** Builds and returns the ConfirmationOutput instance. */
+        fun build() = ConfirmationOutput(confirmation)
+    }
+
+    companion object {
+        /** Returns a default ExecutionResult instance. */
+        @JvmStatic
+        fun <ConfirmationT> getDefaultInstance() = ConfirmationOutput.Builder<ConfirmationT>()
+            .build()
+    }
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.java
deleted file mode 100644
index b42f20b..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.java
+++ /dev/null
@@ -1,82 +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;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.google.auto.value.AutoValue;
-
-/**
- * Class that represents the response after an ActionCapability fulfills an action.
- *
- * @param <OutputT>
- */
-@AutoValue
-public abstract class ExecutionResult<OutputT> {
-
-    /** Create a Builder instance for building a ExecutionResult instance without output. */
-    @NonNull
-    public static Builder<Void> newBuilder() {
-        return new AutoValue_ExecutionResult.Builder<Void>().setStartDictation(false);
-    }
-
-    /** Returns a default ExecutionResult instance. */
-    @NonNull
-    public static ExecutionResult<Void> getDefaultInstance() {
-        return ExecutionResult.newBuilder().build();
-    }
-
-    /** Create a Builder instance for building a ExecutionResult instance. */
-    @NonNull
-    public static <OutputT> Builder<OutputT> newBuilderWithOutput() {
-        return new AutoValue_ExecutionResult.Builder<OutputT>().setStartDictation(false);
-    }
-
-    /** Returns a default ExecutionResult instance with an output type. */
-    @NonNull
-    public static <OutputT> ExecutionResult<OutputT> getDefaultInstanceWithOutput() {
-        return ExecutionResult.<OutputT>newBuilderWithOutput().build();
-    }
-
-    /** Whether to start dictation mode after the fulfillment. */
-    public abstract boolean getStartDictation();
-
-    /** The execution output. */
-    @Nullable
-    public abstract OutputT getOutput();
-
-    /**
-     * Builder for ExecutionResult.
-     *
-     * @param <OutputT>
-     */
-    @AutoValue.Builder
-    public abstract static class Builder<OutputT> {
-        /** Sets whether or not this fulfillment should start dictation. */
-        @NonNull
-        public abstract Builder<OutputT> setStartDictation(boolean startDictation);
-
-        /** Sets the execution output. */
-        @NonNull
-        public abstract Builder<OutputT> setOutput(OutputT output);
-
-        /** Builds and returns the ExecutionResult instance. */
-        @NonNull
-        public abstract ExecutionResult<OutputT> build();
-    }
-}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.kt
new file mode 100644
index 0000000..1234fe0
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ExecutionResult.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.appactions.interaction.capabilities.core
+
+import java.util.Objects
+/**
+ * Class that represents the response after an ActionCapability fulfills an action.
+ *
+ * @param <OutputT>
+ */
+class ExecutionResult<OutputT> internal constructor(
+    val startDictation: Boolean,
+    val output: OutputT?,
+) {
+    override fun toString() =
+        "ExecutionResult(startDictation=$startDictation,output=$output)"
+
+    override fun equals(other: Any?): Boolean {
+        return other is ExecutionResult<*> && output == other.output
+    }
+
+    override fun hashCode() = Objects.hash(startDictation, output)
+
+    /**
+     * Builder for ExecutionResult.
+     *
+     * @param <OutputT>
+     */
+    class Builder<OutputT> {
+        private var startDictation: Boolean = false
+
+        private var output: OutputT? = null
+
+        /** Sets whether or not this fulfillment should start dictation. */
+        fun setStartDictation(startDictation: Boolean) = apply {
+            this.startDictation = startDictation
+        }
+
+        /** Sets the execution output. */
+        fun setOutput(output: OutputT) = apply {
+            this.output = output
+        }
+
+        /** Builds and returns the ExecutionResult instance. */
+        fun build() = ExecutionResult(startDictation, output)
+    }
+
+    companion object {
+        /** Returns a default ExecutionResult instance. */
+        @JvmStatic
+        fun <OutputT> getDefaultInstance() = ExecutionResult.Builder<OutputT>().build()
+    }
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/HostProperties.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/HostProperties.kt
new file mode 100644
index 0000000..c0ceb39
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/HostProperties.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.util.SizeF
+import java.util.Objects
+
+/**
+ * HostProperties contains information about the host that can be used to customize behaviour for
+ * different environments.
+ */
+class HostProperties internal constructor(val maxHostSizeDp: SizeF) {
+    override fun toString() =
+        "HostProperties(maxHostSizeDp=$maxHostSizeDp)"
+
+    override fun equals(other: Any?): Boolean {
+        return other is HostProperties && maxHostSizeDp == other.maxHostSizeDp
+    }
+
+    override fun hashCode() = Objects.hash(maxHostSizeDp)
+
+    /**
+     * Builder class for HostProperties.
+     */
+    class Builder {
+        private var maxHostSizeDp: SizeF? = null
+
+        /** Sets the dimensions of the host area where the app content will be displayed in dp. */
+        fun setMaxHostSizeDp(maxHostSizeDp: SizeF) = apply {
+            this.maxHostSizeDp = maxHostSizeDp
+        }
+
+        /**
+         * Builds and returns the HostProperties instance.
+         */
+        fun build() = HostProperties(
+            requireNotNull(maxHostSizeDp, { "maxHostSizeDp must be set." }),
+        )
+    }
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/InitArg.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/InitArg.kt
new file mode 100644
index 0000000..f01729c
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/InitArg.kt
@@ -0,0 +1,29 @@
+/*
+ * 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
+
+/**
+ * InitArg contains data passed to {@code BaseSession#onInit}.
+ */
+class InitArg internal constructor() {
+    override fun toString() =
+        "InitArg()"
+
+    override fun equals(other: Any?): Boolean {
+        return other is InitArg
+    }
+}
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/SessionBuilder.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/SessionBuilder.kt
new file mode 100644
index 0000000..7aa2a29
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/SessionBuilder.kt
@@ -0,0 +1,29 @@
+/*
+ * 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
+
+/**
+ * Interface to be implemented for creating SessionT instances.
+ */
+fun interface SessionBuilder<SessionT> {
+    /**
+     * @return A new SessionT instance for handling a task.
+     */
+    fun createSession(
+        hostProperties: HostProperties,
+    ): SessionT
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilitySession.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilitySession.kt
new file mode 100644
index 0000000..0a9fb0e
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilitySession.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.RestrictTo
+
+/**
+ * Internal interface for a session, contains developer's Session instance
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+interface ActionCapabilitySession {
+    /**
+     * 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.
+     */
+    fun execute(
+        argumentsWrapper: ArgumentsWrapper,
+        callback: CallbackInternal,
+    )
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilityImpl.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilityImpl.kt
new file mode 100644
index 0000000..76ed7b5
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilityImpl.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.capabilities.core.BaseSession
+import androidx.appactions.interaction.capabilities.core.HostProperties
+import androidx.appactions.interaction.capabilities.core.SessionBuilder
+import androidx.appactions.interaction.capabilities.core.impl.spec.ActionSpec
+import androidx.appactions.interaction.proto.AppActionsContext.AppAction
+import androidx.appactions.interaction.proto.TaskInfo
+
+import androidx.annotation.RestrictTo
+
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+internal class SingleTurnCapabilityImpl<
+    PropertyT,
+    ArgumentT,
+    OutputT,
+    > constructor(
+    override val id: String?,
+    val actionSpec: ActionSpec<PropertyT, ArgumentT, OutputT>,
+    val property: PropertyT,
+    val sessionBuilder: SessionBuilder<BaseSession<ArgumentT, OutputT>>,
+) : ActionCapability {
+    override val supportsMultiTurnTask = false
+
+    @NonNull
+    override fun getAppAction(): AppAction {
+        val appActionBuilder = actionSpec.convertPropertyToProto(property).toBuilder()
+            .setTaskInfo(TaskInfo.newBuilder().setSupportsPartialFulfillment(false))
+        id?.let(appActionBuilder::setIdentifier)
+        return appActionBuilder.build()
+    }
+
+    @NonNull
+    override fun createSession(hostProperties: HostProperties): ActionCapabilitySession {
+        return SingleTurnCapabilitySession(
+            actionSpec,
+            sessionBuilder.createSession(hostProperties),
+        )
+    }
+}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilitySession.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilitySession.kt
new file mode 100644
index 0000000..1b8bcf5
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilitySession.kt
@@ -0,0 +1,90 @@
+
+/*
+ * 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.ExecutionResult
+import androidx.appactions.interaction.capabilities.core.BaseSession
+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.spec.ActionSpec
+import androidx.appactions.interaction.proto.FulfillmentRequest.Fulfillment.FulfillmentValue
+import androidx.appactions.interaction.proto.FulfillmentResponse
+import androidx.appactions.interaction.proto.ParamValue
+
+import androidx.annotation.RestrictTo
+
+/**
+ * ActionCapabilitySession implementation for executing single-turn fulfillment requests.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+internal class SingleTurnCapabilitySession<
+    ArgumentT,
+    OutputT,
+>(
+    val actionSpec: ActionSpec<*, ArgumentT, OutputT>,
+    val externalSession: BaseSession<ArgumentT, OutputT>,
+) : ActionCapabilitySession {
+    override fun execute(
+        @NonNull argumentsWrapper: ArgumentsWrapper,
+        @NonNull callback: CallbackInternal,
+    ) {
+        val paramValuesMap: Map<String, List<ParamValue>> = argumentsWrapper.paramValues().entries
+            .associate {
+                    entry: Map.Entry<String, List<FulfillmentValue>> ->
+                Pair(
+                    entry.key,
+                    entry.value.mapNotNull {
+                            fulfillmentValue: FulfillmentValue ->
+                        fulfillmentValue.getValue()
+                    },
+                )
+            }
+        val argument = actionSpec.buildArgument(paramValuesMap)
+        Futures.addCallback(
+            externalSession.onFinishAsync(argument),
+            object : FutureCallback<ExecutionResult<OutputT>> {
+                override fun onSuccess(executionResult: ExecutionResult<OutputT>) {
+                    callback.onSuccess(convertToFulfillmentResponse(executionResult))
+                }
+
+                override fun onFailure(t: Throwable) {
+                    callback.onError(ErrorStatusInternal.CANCELLED)
+                }
+            },
+            Runnable::run,
+        )
+    }
+
+    /** Converts typed {@link ExecutionResult} to {@link FulfillmentResponse} proto. */
+    private fun convertToFulfillmentResponse(
+        executionResult: ExecutionResult<OutputT>,
+    ): FulfillmentResponse {
+        val fulfillmentResponseBuilder =
+            FulfillmentResponse.newBuilder()
+                .setStartDictation(executionResult.startDictation)
+        executionResult.output?.let { it ->
+            fulfillmentResponseBuilder.setExecutionOutput(
+                actionSpec.convertOutputToProto(it),
+            )
+        }
+        return fulfillmentResponseBuilder.build()
+    }
+}
\ No newline at end of file
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
deleted file mode 100644
index a6bfaad..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImpl.java
+++ /dev/null
@@ -1,134 +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.spec;
-
-import static androidx.appactions.interaction.capabilities.core.impl.utils.ImmutableCollectors.toImmutableList;
-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.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;
-import androidx.appactions.interaction.proto.AppActionsContext.AppAction;
-import androidx.appactions.interaction.proto.FulfillmentRequest.Fulfillment.FulfillmentValue;
-import androidx.appactions.interaction.proto.FulfillmentResponse;
-import androidx.appactions.interaction.proto.ParamValue;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * The implementation of the {@link ActionCapability} interface.
- *
- * @param <PropertyT>
- * @param <ArgumentT>
- * @param <OutputT>
- */
-public final class ActionCapabilityImpl<PropertyT, ArgumentT, OutputT> implements ActionCapability {
-
-    private static final String LOG_TAG = "ActionCapability";
-    private final ActionSpec<PropertyT, ArgumentT, OutputT> mActionSpec;
-    private final Optional<String> mIdentifier;
-    private final PropertyT mProperty;
-    private final ActionExecutor<ArgumentT, OutputT> mActionExecutor;
-
-    public ActionCapabilityImpl(
-            @NonNull ActionSpec<PropertyT, ArgumentT, OutputT> actionSpec,
-            @NonNull Optional<String> identifier,
-            @NonNull PropertyT property,
-            @NonNull ActionExecutor<ArgumentT, OutputT> actionExecutor) {
-        this.mActionSpec = actionSpec;
-        this.mIdentifier = identifier;
-        this.mProperty = property;
-        this.mActionExecutor = actionExecutor;
-    }
-
-    @NonNull
-    @Override
-    public Optional<String> getId() {
-        return mIdentifier;
-    }
-
-    @NonNull
-    @Override
-    public AppAction getAppAction() {
-        AppAction appAction = mActionSpec.convertPropertyToProto(mProperty);
-        if (mIdentifier.isPresent()) {
-            appAction = appAction.toBuilder().setIdentifier(mIdentifier.get()).build();
-        }
-        return appAction;
-    }
-
-    @Override
-    public void execute(
-            @NonNull ArgumentsWrapper argumentsWrapper, @NonNull CallbackInternal callback) {
-        // Filter out the task parts of ArgumentsWrapper. Send the raw arguments for one-shot
-        // capabilities.
-        Map<String, List<ParamValue>> args =
-                argumentsWrapper.paramValues().entrySet().stream()
-                        .collect(
-                                toImmutableMap(
-                                        Map.Entry::getKey,
-                                        e ->
-                                                e.getValue().stream()
-                                                        .filter(FulfillmentValue::hasValue)
-                                                        .map(FulfillmentValue::getValue)
-                                                        .collect(toImmutableList())));
-        try {
-            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());
-            }
-            callback.onError(ErrorStatusInternal.STRUCT_CONVERSION_FAILURE);
-        }
-    }
-
-    /** Converts typed {@link ExecutionResult} to {@link FulfillmentResponse} proto. */
-    FulfillmentResponse convertToFulfillmentResponse(ExecutionResult<OutputT> executionResult) {
-        FulfillmentResponse.Builder fulfillmentResponseBuilder =
-                FulfillmentResponse.newBuilder()
-                        .setStartDictation(executionResult.getStartDictation());
-        OutputT output = executionResult.getOutput();
-        if (output != null && !(output instanceof Void)) {
-            fulfillmentResponseBuilder.setExecutionOutput(mActionSpec.convertOutputToProto(output));
-        }
-        return fulfillmentResponseBuilder.build();
-    }
-}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecImpl.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecImpl.java
index de3aa6a..1c427d1 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecImpl.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecImpl.java
@@ -33,7 +33,7 @@
 
 /** The implementation of {@code ActionSpec} interface. */
 final class ActionSpecImpl<
-        PropertyT, ArgumentT, ArgumentBuilderT extends BuilderOf<ArgumentT>, OutputT>
+                PropertyT, ArgumentT, ArgumentBuilderT extends BuilderOf<ArgumentT>, OutputT>
         implements ActionSpec<PropertyT, ArgumentT, OutputT> {
 
     private final String mCapabilityName;
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 2655700..c3e46f2 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,6 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.appactions.interaction.capabilities.core.ActionCapability;
 import androidx.appactions.interaction.capabilities.core.impl.ArgumentsWrapper;
 import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
@@ -47,7 +48,9 @@
  * @param <OutputT>
  * @param <ConfirmationT>
  * @param <TaskUpdaterT>
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 public final class TaskCapabilityImpl<
                 PropertyT,
                 ArgumentT,
@@ -104,8 +107,13 @@
 
     @NonNull
     @Override
-    public Optional<String> getId() {
-        return Optional.of(mIdentifier);
+    public String getId() {
+        return mIdentifier;
+    }
+
+    @Override
+    public boolean getSupportsMultiTurnTask() {
+        return true;
     }
 
     public void setTaskUpdaterSupplier(@NonNull Supplier<TaskUpdaterT> taskUpdaterSupplier) {
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/SingleTurnCapabilityTest.kt b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilityTest.kt
new file mode 100644
index 0000000..2082eb6
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/SingleTurnCapabilityTest.kt
@@ -0,0 +1,128 @@
+/*
+ * 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 android.util.SizeF
+import androidx.appactions.interaction.capabilities.core.ActionCapability
+import androidx.appactions.interaction.capabilities.core.ExecutionResult
+import androidx.appactions.interaction.capabilities.core.HostProperties
+import androidx.appactions.interaction.capabilities.core.impl.concurrent.Futures
+import androidx.appactions.interaction.capabilities.core.impl.converters.TypeConverters
+import androidx.appactions.interaction.capabilities.core.impl.spec.ActionSpec
+import androidx.appactions.interaction.capabilities.core.impl.spec.ActionSpecBuilder
+import androidx.appactions.interaction.capabilities.core.properties.EntityProperty
+import androidx.appactions.interaction.capabilities.core.properties.StringProperty
+import androidx.appactions.interaction.capabilities.core.testing.ArgumentUtils
+import androidx.appactions.interaction.capabilities.core.testing.spec.Argument
+import androidx.appactions.interaction.capabilities.core.testing.spec.Output
+import androidx.appactions.interaction.capabilities.core.testing.spec.Property
+import androidx.appactions.interaction.capabilities.core.testing.spec.Session
+import androidx.appactions.interaction.proto.FulfillmentResponse
+import androidx.appactions.interaction.proto.FulfillmentResponse.StructuredOutput
+import androidx.appactions.interaction.proto.FulfillmentResponse.StructuredOutput.OutputValue
+import androidx.appactions.interaction.proto.ParamValue
+import com.google.common.util.concurrent.ListenableFuture
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.mock
+
+@RunWith(JUnit4::class)
+class SingleTurnCapabilityTest {
+
+    val mockCalback: CallbackInternal = mock()
+
+    @Test
+    fun oneShotCapability_successWithOutput() {
+        val capability: ActionCapability =
+            SingleTurnCapabilityImpl<Property, Argument, Output>(
+                "capabilityId",
+                ACTION_SPEC,
+                Property.newBuilder().setRequiredEntityField(
+                    EntityProperty.EMPTY,
+                ).setOptionalStringField(
+                    StringProperty.PROHIBITED,
+                ).build(),
+                {
+                    object : Session {
+                        override fun onFinishAsync(
+                            argument: Argument,
+                        ): ListenableFuture<ExecutionResult<Output>> {
+                            return Futures.immediateFuture(
+                                ExecutionResult.Builder<Output>().setOutput(
+                                    Output.builder().setOptionalStringField("stringOutput")
+                                        .build(),
+                                ).build(),
+                            )
+                        }
+                    }
+                },
+            )
+        val expectedFulfillmentResponse: FulfillmentResponse =
+            FulfillmentResponse.newBuilder().setExecutionOutput(
+                StructuredOutput.newBuilder()
+                    .addOutputValues(
+                        OutputValue.newBuilder()
+                            .setName("optionalStringOutput")
+                            .addValues(
+                                ParamValue.newBuilder()
+                                    .setStringValue("stringOutput")
+                                    .build(),
+                            )
+                            .build(),
+                    )
+                    .build(),
+            ).build()
+
+        val capabilitySession = capability.createSession(
+            HostProperties.Builder().setMaxHostSizeDp(SizeF(300f, 500f)).build(),
+        )
+        capabilitySession.execute(
+            ArgumentUtils.buildArgs(
+                mapOf(
+                    "optionalString" to ParamValue.newBuilder().setIdentifier(
+                        "string argument value",
+                    ).build(),
+                ),
+            ),
+            mockCalback,
+        )
+
+        verify(mockCalback).onSuccess(expectedFulfillmentResponse)
+    }
+
+    companion object {
+        val ACTION_SPEC: ActionSpec<Property, Argument, Output> =
+            ActionSpecBuilder.ofCapabilityNamed(
+                "actions.intent.TEST",
+            )
+                .setDescriptor(Property::class.java)
+                .setArgument(Argument::class.java, Argument::newBuilder)
+                .setOutput(Output::class.java)
+                .bindOptionalStringParameter(
+                    "optionalString",
+                    Property::optionalStringField,
+                    Argument.Builder::setOptionalStringField,
+                )
+                .bindOptionalOutput(
+                    "optionalStringOutput",
+                    Output::optionalStringField,
+                    TypeConverters::toParamValue,
+                ).build()
+    }
+}
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
deleted file mode 100644
index 47d20b5..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImplTest.java
+++ /dev/null
@@ -1,129 +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.spec;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-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;
-import androidx.appactions.interaction.capabilities.core.testing.spec.Output;
-import androidx.appactions.interaction.capabilities.core.testing.spec.Property;
-import androidx.appactions.interaction.proto.FulfillmentRequest.Fulfillment;
-import androidx.appactions.interaction.proto.FulfillmentResponse;
-import androidx.appactions.interaction.proto.FulfillmentResponse.StructuredOutput;
-import androidx.appactions.interaction.proto.FulfillmentResponse.StructuredOutput.OutputValue;
-import androidx.appactions.interaction.proto.ParamValue;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.List;
-import java.util.Optional;
-
-@RunWith(JUnit4.class)
-public final class ActionCapabilityImplTest {
-
-    private static final ActionSpec<Property, Argument, Output> ACTION_SPEC =
-            ActionSpecBuilder.ofCapabilityNamed("actions.intent.TEST")
-                    .setDescriptor(Property.class)
-                    .setArgument(Argument.class, Argument::newBuilder)
-                    .setOutput(Output.class)
-                    .bindRequiredEntityParameter(
-                            "requiredEntity",
-                            Property::requiredEntityField,
-                            Argument.Builder::setRequiredEntityField)
-                    .bindOptionalOutput(
-                            "optionalStringOutput",
-                            Output::optionalStringField,
-                            TypeConverters::toParamValue)
-                    .bindRepeatedOutput(
-                            "repeatedStringOutput",
-                            Output::repeatedStringField,
-                            TypeConverters::toParamValue)
-                    .build();
-    @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();
-
-        ExecutionResult<Output> executionResult =
-                ExecutionResult.<Output>newBuilderWithOutput()
-                        .setOutput(
-                                Output.builder()
-                                        .setOptionalStringField("test2")
-                                        .setRepeatedStringField(List.of("test3", "test4"))
-                                        .build())
-                        .build();
-        ActionCapabilityImpl<Property, Argument, Output> capability =
-                new ActionCapabilityImpl<>(
-                        ACTION_SPEC,
-                        Optional.of("id"),
-                        property,
-                        (argument) -> Futures.immediateFuture(executionResult));
-        StructuredOutput expectedExecutionOutput =
-                StructuredOutput.newBuilder()
-                        .addOutputValues(
-                                OutputValue.newBuilder()
-                                        .setName("optionalStringOutput")
-                                        .addValues(
-                                                ParamValue.newBuilder()
-                                                        .setStringValue("test2")
-                                                        .build())
-                                        .build())
-                        .addOutputValues(
-                                OutputValue.newBuilder()
-                                        .setName("repeatedStringOutput")
-                                        .addValues(
-                                                ParamValue.newBuilder()
-                                                        .setStringValue("test3")
-                                                        .build())
-                                        .addValues(
-                                                ParamValue.newBuilder()
-                                                        .setStringValue("test4")
-                                                        .build())
-                                        .build())
-                        .build();
-
-        capability.execute(
-                ArgumentsWrapper.create(Fulfillment.getDefaultInstance()), mCallbackInternal);
-
-        verify(mCallbackInternal).onSuccess(mCaptor.capture());
-        assertThat(mCaptor.getValue().getExecutionOutput().getOutputValuesList())
-                .containsExactlyElementsIn(expectedExecutionOutput.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 341351f..9e8b6bd 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
@@ -19,15 +19,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 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.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;
@@ -92,11 +89,6 @@
                             TypeConverters::toParamValue)
                     .build();
 
-    private static ActionCapability createCapability(
-            String id, Property property, ActionExecutor<Argument, Output> executor) {
-        return new ActionCapabilityImpl<>(ACTION_SPEC, Optional.of(id), property, executor);
-    }
-
     @Test
     public void getAppAction_onlyRequiredProperty() {
         Property property =
@@ -112,13 +104,9 @@
                                 .build(),
                         StringProperty.EMPTY);
 
-        ActionCapability capability =
-                        createCapability("id", property, TestingUtils.createFakeActionExecutor());
-
-        assertThat(capability.getAppAction())
+        assertThat(ACTION_SPEC.convertPropertyToProto(property))
                 .isEqualTo(
                         AppAction.newBuilder()
-                                .setIdentifier("id")
                                 .setName("actions.intent.TEST")
                                 .addParams(
                                         IntentParameter.newBuilder()
@@ -185,13 +173,9 @@
                                         .build()),
                         Optional.of(StringProperty.PROHIBITED));
 
-        ActionCapability capability =
-                        createCapability("id", property, TestingUtils.createFakeActionExecutor());
-
-        assertThat(capability.getAppAction())
+        assertThat(ACTION_SPEC.convertPropertyToProto(property))
                 .isEqualTo(
                         AppAction.newBuilder()
-                                .setIdentifier("id")
                                 .setName("actions.intent.TEST")
                                 .addParams(
                                         IntentParameter.newBuilder()
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 95fb392..1c5e9e7 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
@@ -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;
@@ -180,7 +179,7 @@
             EMPTY_CONFIRM_LISTENER = Optional.empty();
     private static final OnDialogFinishListener<Argument, Output> EMPTY_FINISH_LISTENER =
             (finalArgs) ->
-                    Futures.immediateFuture(ExecutionResult.<Output>getDefaultInstanceWithOutput());
+                    Futures.immediateFuture(ExecutionResult.<Output>getDefaultInstance());
 
     private static boolean groundingPredicate(ParamValue paramValue) {
         return !paramValue.hasIdentifier();
@@ -846,7 +845,7 @@
         OnDialogFinishListener<Argument, Output> finishListener =
                 (argument) ->
                         Futures.immediateFuture(
-                                ExecutionResult.<Output>newBuilderWithOutput()
+                                new ExecutionResult.Builder<Output>()
                                         .setOutput(
                                                 Output.builder()
                                                         .setOptionalStringField("bar")
@@ -1095,7 +1094,7 @@
         OnReadyToConfirmListenerInternal<Confirmation> onReadyToConfirmListener =
                 (args) ->
                         Futures.immediateFuture(
-                                ConfirmationOutput.<Confirmation>newBuilderWithConfirmation()
+                                new ConfirmationOutput.Builder<Confirmation>()
                                         .setConfirmation(
                                                 Confirmation.builder()
                                                         .setOptionalStringField("bar")
@@ -1124,7 +1123,7 @@
         OnReadyToConfirmListenerInternal<Confirmation> onReadyToConfirmListener =
                 (args) ->
                         Futures.immediateFuture(
-                                ConfirmationOutput.<Confirmation>newBuilderWithConfirmation()
+                                new ConfirmationOutput.Builder<Confirmation>()
                                         .setConfirmation(
                                                 Confirmation.builder()
                                                         .setOptionalStringField("bar")
@@ -1133,7 +1132,7 @@
         OnDialogFinishListener<Argument, Output> finishListener =
                 (argument) ->
                         Futures.immediateFuture(
-                                ExecutionResult.<Output>newBuilderWithOutput()
+                                new ExecutionResult.Builder<Output>()
                                         .setOutput(
                                                 Output.builder()
                                                         .setOptionalStringField("baz")
@@ -1185,7 +1184,7 @@
         OnReadyToConfirmListenerInternal<Confirmation> onReadyToConfirmListener =
                 (args) ->
                         Futures.immediateFuture(
-                                ConfirmationOutput.<Confirmation>newBuilderWithConfirmation()
+                                new ConfirmationOutput.Builder<Confirmation>()
                                         .setConfirmation(
                                                 Confirmation.builder()
                                                         .setOptionalStringField("bar")
@@ -1194,7 +1193,7 @@
         OnDialogFinishListener<Argument, Output> finishListener =
                 (argument) ->
                         Futures.immediateFuture(
-                                ExecutionResult.<Output>newBuilderWithOutput()
+                                new ExecutionResult.Builder<Output>()
                                         .setOutput(
                                                 Output.builder()
                                                         .setOptionalStringField("baz")
@@ -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 77a56b6..d66e0ee 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
@@ -115,7 +115,7 @@
                 (finalArgs) -> {
                     future.set(finalArgs);
                     return Futures.immediateFuture(
-                            ConfirmationOutput.<ConfirmationT>getDefaultInstanceWithConfirmation());
+                            ConfirmationOutput.getDefaultInstance());
                 });
     }
 
@@ -124,7 +124,7 @@
                     SettableFutureWrapper<ArgumentT> future) {
         return (finalArgs) -> {
             future.set(finalArgs);
-            return Futures.immediateFuture(ExecutionResult.<OutputT>getDefaultInstanceWithOutput());
+            return Futures.immediateFuture(ExecutionResult.<OutputT>getDefaultInstance());
         };
     }
 
@@ -205,6 +205,6 @@
     public static <ArgumentT, OutputT>
             ActionExecutor<ArgumentT, OutputT> createFakeActionExecutor() {
         return (args) ->
-                Futures.immediateFuture(ExecutionResult.<OutputT>getDefaultInstanceWithOutput());
+                Futures.immediateFuture(ExecutionResult.<OutputT>getDefaultInstance());
     }
 }
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Output.java b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Output.java
index c18a61a..5464ff6 100644
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Output.java
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Output.java
@@ -18,6 +18,7 @@
 
 import com.google.auto.value.AutoValue;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 
@@ -26,12 +27,11 @@
 public abstract class Output {
 
     public static Builder builder() {
-        return new AutoValue_Output.Builder();
+        return new AutoValue_Output.Builder().setRepeatedStringField(Collections.emptyList());
     }
 
     public abstract Optional<String> optionalStringField();
 
-    @SuppressWarnings("AutoValueImmutableFields")
     public abstract List<String> repeatedStringField();
 
     @AutoValue.Builder
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Session.kt b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Session.kt
new file mode 100644
index 0000000..60de640
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/spec/Session.kt
@@ -0,0 +1,21 @@
+/*
+ * 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.testing.spec
+
+import androidx.appactions.interaction.capabilities.core.BaseSession
+
+interface Session : BaseSession<Argument, Output>
\ No newline at end of file
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/appactions/interaction/interaction-proto/src/main/proto/app_actions_data.proto b/appactions/interaction/interaction-proto/src/main/proto/app_actions_data.proto
index 6a4d67d..3548f99 100644
--- a/appactions/interaction/interaction-proto/src/main/proto/app_actions_data.proto
+++ b/appactions/interaction/interaction-proto/src/main/proto/app_actions_data.proto
@@ -23,7 +23,6 @@
 option java_outer_classname = "AppActionsDataProto";
 option java_multiple_files = true;
 
-
 message ParamValue {
   // If this parameter matched an Entity, `identifier` of that Entity.
   optional string identifier = 1;
@@ -86,16 +85,16 @@
 }
 
 // Represents the data to describe app actions.
-// Next ID: 3
+// Next ID: 5
 message AppActionsContext {
-  repeated AppAction actions = 1;
 
   message AppAction {
     // Name of the intent. For example: actions.intent.UPDATE_FORM_FIELD
     string name = 1;
 
     // One intent can be registered multiple times. Use this field to identify
-    // the intents.
+    // the intents. Developers can set this field via `fulfillmentId` in both shortcuts.xml and the
+    // Capability library of the AppInteractionSDK.
     string identifier = 2;
 
     repeated IntentParameter params = 4;
@@ -114,6 +113,11 @@
     // has optional confirmation and the developer has provided a confirmation
     // callback.
     bool needs_confirmation = 7;
+
+    // Describes the restrictions needed to execute this action.
+    // It would be set by the app and checked by the assistant to ensure the
+    // restrictions can be supported.
+    repeated Restriction restrictions = 8;
   }
 
   // Next ID: 9
@@ -122,7 +126,7 @@
     string name = 1;
 
     // Current values of the associated parameter.
-    repeated CurrentValue current_value = 7;
+    repeated CurrentValue current_value = 7 [deprecated = true];
 
     // List of possible values for this parameter.
     repeated Entity possible_entities = 3;
@@ -150,11 +154,49 @@
     // Whether or not this parameter field is focused right now.
     // If yes, it usually suggests that Assistant will prompt the value for this
     // argument.
-    bool is_focused = 8;
+    bool is_focused = 8 [deprecated = true];
 
     reserved 2;
   }
 
+  message AppDialogState {
+    // Each App capability can be associated with multiple dialogs. Use this
+    // field to identify the dialog instance.
+    string dialog_identifier = 1;
+
+    // Identifier of the corresponding capability that this dialog state maps
+    // to. This field maps to AppActionsContext.AppAction.identifier.
+    string fulfillment_identifier = 2;
+
+    // List of BII intent parameters of this dialog.
+    repeated DialogParameter params = 3;
+  }
+
+  message DialogParameter {
+    // The built-in-intent parameter name. For example: "textField.name".
+    string name = 1;
+
+    // Current values of the associated parameter.
+    repeated CurrentValue current_value = 2;
+
+    bool is_focused = 3;
+  }
+
+  // Current version of the protocol. Populated with values from the artifact version of the
+  // interaction-proto Jetpack library.
+  optional Version version = 4;
+
+  // Represents the dynamic capabilities declared by an App. Capabilities
+  // declare the types of actions a developer can take to launch an app and jump
+  // directly to performing a specific task. Dynamic capabilities are not
+  // declared in shortcuts.xml, but are added during runtime.
+  repeated AppAction actions = 1;
+
+  // Represents the current dialog state, which is a list of built-in-intent
+  // parameters and corresponding values from users. App
+  // Dialog is a transaction session of intent and intent parameters.
+  repeated AppDialogState dialog_states = 3;
+
   // This field contains the info for current focused text input.
   TextInputState text_input_state = 2;
 }
@@ -204,18 +246,44 @@
 
     enum Type {
       UNKNOWN_TYPE = 0;
-      // Assistant is asking to sync the current state with the app.
+      // Assistant is asking to sync the current state with the app. The intent
+      // will be executed if:
+      // - App-side checks have passed:
+      //     - no validation failures
+      //     - no intent (value) suggestions
+      //     - no confirmation suggestions or user has confirmed intent
+      // - Assistant-side checks have passed
       SYNC = 1;
       // Assistant confirms an ongoing task with the app.
-      CONFIRM = 2;
+      // Deprecated: set SyncStatus = INTENT_CONFIRMED instead.
+      CONFIRM = 2 [deprecated = true];
       // Assistant cancels an ongoing task of the app.
       CANCEL = 3;
       // Assistant terminates an ongoing task of the app.
       TERMINATE = 4;
     }
 
+    enum SyncStatus {
+      UNKNOWN_SYNC_STATUS = 0;
+      // Assistant-side checks have not passed and the App should not execute
+      // yet even if App-side checks pass.
+      SLOTS_INCOMPLETE = 1;
+      // Assistant-side checks have passed. The App may execute or suggest
+      // confirmation if App-side validation succeeds.
+      SLOTS_COMPLETE = 2;
+      // User confirmed the intent and the App should execute. This indicates
+      // that the App has requested confirmation so it should not request
+      // confirmation again.
+      INTENT_CONFIRMED = 3;
+    }
+
     // The current progress of handling the dialog.
-    optional Type type = 4;
+    optional Type type = 5;
+
+    // The status of the SYNC request. Only set when fulfillment type == SYNC.
+    optional SyncStatus sync_status = 6;
+
+    reserved 4;
   }
 
   // This field should be treated as an optional field. Only the first
@@ -292,3 +360,27 @@
     HAS_CONTENT = 2;
   }
 }
+
+// Versioning to maintain compatibility
+message Version {
+  // The major version.
+  optional uint64 major = 1;
+
+  // The minor version.
+  optional uint64 minor = 2;
+
+  // The patch version.
+  optional uint64 patch = 3;
+
+  // The prerelease version: a series of dot-separated identifiers.
+  optional string prerelease_id = 4;
+}
+
+// Restrictions to run a specific AppAction.
+message Restriction {
+  oneof requirement {
+    // If true, the corresponding AppAction requires assistant to
+    // start dictation.
+    bool text_input = 1;
+  }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-service/build.gradle b/appactions/interaction/interaction-service/build.gradle
index d528b0e..226a274 100644
--- a/appactions/interaction/interaction-service/build.gradle
+++ b/appactions/interaction/interaction-service/build.gradle
@@ -20,18 +20,45 @@
     id("AndroidXPlugin")
     id("com.android.library")
     id("com.google.protobuf")
+    id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
+    implementation(libs.grpcAndroid)
+    implementation(libs.grpcBinder)
+    implementation(libs.grpcStub)
     implementation(libs.protobufLite)
     implementation("androidx.annotation:annotation:1.1.0")
+    implementation("androidx.concurrent:concurrent-futures:1.1.0")
+    implementation("androidx.wear.tiles:tiles:1.1.0")
+    implementation("javax.annotation:javax.annotation-api:1.3.2")
+    // TODO(b/268709908): Bump this to version 1.52.0 and make available from libs.grpcProtobufLite
+    implementation("io.grpc:grpc-protobuf-lite:1.45.1")
+    implementation(project(":appactions:interaction:interaction-capabilities-core"))
     implementation(project(":appactions:interaction:interaction-proto"))
+    implementation(libs.kotlinStdlib)
+
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.junit)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.testExtTruth)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.truth)
 }
 
 protobuf {
     protoc {
         artifact = libs.protobufCompiler.get()
     }
+    // Configure the codegen plugins
+    plugins {
+        grpc {
+            artifact = 'io.grpc:protoc-gen-grpc-java:1.52.0'
+        }
+    }
+
     // Generates the java proto-lite code for the protos in this project. See
     // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
     // for more information.
@@ -42,12 +69,30 @@
                     option "lite"
                 }
             }
+            task.plugins {
+                grpc {
+                    option 'lite'
+                }
+            }
         }
     }
 }
 
 android {
     namespace "androidx.appactions.interaction.service"
+    defaultConfig {
+        // TODO(b/266649259): Temporary bump to 33 to support capabilities-core. Lower back to 25 to
+        // support wear:tiles
+        minSdkVersion 33
+    }
+    defaultConfig {
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+    testOptions {
+        unitTests {
+            includeAndroidResources = true
+        }
+    }
 }
 
 androidx {
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/ActionCapabilityCallback.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/ActionCapabilityCallback.java
new file mode 100644
index 0000000..0c72af4
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/ActionCapabilityCallback.java
@@ -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.appactions.interaction.service;
+
+import androidx.annotation.NonNull;
+import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
+import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
+import androidx.appactions.interaction.proto.FulfillmentResponse;
+import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
+
+/** Service implementation of the capability library execution callback. */
+final class ActionCapabilityCallback implements CallbackInternal {
+
+    private final Completer<FulfillmentResponse> mCompleter;
+
+    ActionCapabilityCallback(@NonNull Completer<FulfillmentResponse> mCompleter) {
+        this.mCompleter = mCompleter;
+    }
+
+    @Override
+    public void onSuccess(@NonNull FulfillmentResponse fulfillmentResponse) {
+        mCompleter.set(fulfillmentResponse);
+    }
+
+    @Override
+    public void onError(@NonNull ErrorStatusInternal errorStatus) {
+        mCompleter.setException(
+                new CapabilityExecutionException(errorStatus, "Error executing action capability"));
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionService.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionService.java
new file mode 100644
index 0000000..41df1b9
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionService.java
@@ -0,0 +1,183 @@
+/*
+ * 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.service;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.util.Log;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appactions.interaction.capabilities.core.ActionCapability;
+import androidx.appactions.interaction.service.proto.AppActionsServiceGrpc;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.grpc.Server;
+import io.grpc.binder.AndroidComponentAddress;
+import io.grpc.binder.BinderServerBuilder;
+import io.grpc.binder.IBinderReceiver;
+import io.grpc.binder.SecurityPolicies;
+import io.grpc.binder.SecurityPolicy;
+import io.grpc.binder.ServerSecurityPolicy;
+
+/**
+ * Base service class for the AppInteractionService SDK. This sets up the GRPC on-device server for
+ * communication with Assistant.
+ */
+// TODO(b/267772921): Rewrite public facing class to Kotlin
+public abstract class AppInteractionService extends Service {
+
+    private static final String TAG = "AppInteractionService";
+    private ServerLifecycle mBinderSupplier;
+
+    public AppInteractionService() {}
+
+    /**
+     * Called by the system once after the Assistant binds to the service.
+     *
+     * @return the list of capabilities that this service supports.
+     */
+    @NonNull
+    protected abstract List<ActionCapability> registerCapabilities();
+
+    /**
+     * Sets a custom {@link SecurityPolicy} for the gRPC service. This gives control over which
+     * clients are allowed to bind to your service.
+     *
+     * <p>Overriding this method is <b>not</b> the preferred method for security enforcement. We
+     * recommend developers override {@link #getAllowedApps()} for security needs. Implementing your
+     * own security policy requires significant care, and an understanding of the details and
+     * pitfalls of Android security. If you choose to do so, we <b>strongly</b> recommend you get
+     * such a change reviewed by Android security experts.
+     */
+    @NonNull
+    protected SecurityPolicy getSecurityPolicy() {
+        return SecurityPolicies.anyOf(
+                getSecurityPolicyFromAllowedList(getAllowedApps()).toArray(new SecurityPolicy[0]));
+    }
+
+    /**
+     * Returns a list of the apps {@link AppVerificationInfo} that are allowed to interact with the
+     * app's bound service. This gives control over which clients are allowed to communicate with
+     * the service.
+     *
+     * <p>This is the default method for enforcing security and must be overridden. Developers
+     * should return an empty list should they choose to define their own security by way of
+     * overriding {@link #getSecurityPolicyFromAllowedList}.
+     */
+    @NonNull
+    protected abstract List<AppVerificationInfo> getAllowedApps();
+
+    /**
+     * Sets a custom {@link SecurityPolicy} for the gRPC service given the client's allowed pairs of
+     * package names with corresponding Sha256 signatures. This gives control over which clients are
+     * allowed to bind to your service.
+     *
+     * <p>A SecurityPolicy is returned per supported Assistant. Such as "Google Assistant", "Bixby",
+     * etc.
+     */
+    @NonNull
+    private List<SecurityPolicy> getSecurityPolicyFromAllowedList(
+            List<AppVerificationInfo> verificationInfoList) {
+
+        List<SecurityPolicy> policies = new ArrayList<>();
+        if (verificationInfoList == null || verificationInfoList.isEmpty()) {
+            policies.add(SecurityPolicies.internalOnly());
+            return policies;
+        }
+        for (AppVerificationInfo verificationInfo : verificationInfoList) {
+            policies.add(
+                    SecurityPolicies.oneOfSignatureSha256Hash(
+                            this.getPackageManager(),
+                            verificationInfo.getPackageName(),
+                            verificationInfo.getSignatures()));
+        }
+        return policies;
+    }
+
+    @Override
+    @CallSuper
+    public void onCreate() {
+        super.onCreate();
+        IBinderReceiver binderReceiver = new IBinderReceiver();
+        ServerSecurityPolicy serverSecurityPolicy =
+                ServerSecurityPolicy.newBuilder()
+                        .servicePolicy(AppActionsServiceGrpc.SERVICE_NAME, getSecurityPolicy())
+                        .build();
+        Server server =
+                BinderServerBuilder.forAddress(
+                                AndroidComponentAddress.forContext(this), binderReceiver)
+                        .securityPolicy(serverSecurityPolicy)
+                        .intercept(new RemoteViewsOverMetadataInterceptor())
+                        .addService(AppInteractionServiceFactory.create(this))
+                        .build();
+
+        mBinderSupplier = new ServerLifecycle(server, binderReceiver);
+    }
+
+    @Override
+    @NonNull
+    public IBinder onBind(@Nullable Intent intent) {
+        return mBinderSupplier.get();
+    }
+
+    @Override
+    @CallSuper
+    public void onDestroy() {
+        if (mBinderSupplier != null) {
+            mBinderSupplier.shutdown();
+        }
+        super.onDestroy();
+    }
+
+    static final class ServerLifecycle {
+        private final Server mServer;
+        private final IBinderReceiver mReceiver;
+        private boolean mStarted;
+
+        ServerLifecycle(Server server, IBinderReceiver receiver) {
+            this.mServer = server;
+            this.mReceiver = receiver;
+        }
+
+        public IBinder get() {
+            synchronized (this) {
+                if (!mStarted) {
+                    try {
+                        mStarted = true;
+                        mServer.start();
+                    } catch (IOException ioe) {
+                        Log.e(TAG, "Unable to start server " + mServer, ioe);
+                    }
+                }
+                return mReceiver.get();
+            }
+        }
+
+        public void shutdown() {
+            if (mStarted) {
+                mServer.shutdownNow();
+                mStarted = false;
+            }
+        }
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceFactory.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceFactory.java
new file mode 100644
index 0000000..59a15f6
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceFactory.java
@@ -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.appactions.interaction.service;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import io.grpc.BindableService;
+
+/**
+ * Factory for returning a BindableService from AppInteractionService.
+ *
+ * <p>This class is public because it's used in the testing library.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public final class AppInteractionServiceFactory {
+
+    /**
+     * Creates a new instance of the gRPC service from the developer's AppInteractionService
+     * (android service)
+     */
+    @NonNull
+    public static BindableService create(@NonNull AppInteractionService appInteractionService) {
+        return new AppInteractionServiceGrpcImpl(appInteractionService);
+    }
+
+    private AppInteractionServiceFactory() {}
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceGrpcImpl.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceGrpcImpl.java
new file mode 100644
index 0000000..8c3a858
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppInteractionServiceGrpcImpl.java
@@ -0,0 +1,34 @@
+/*
+ * 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.service;
+
+import androidx.appactions.interaction.service.proto.AppActionsServiceGrpc.AppActionsServiceImplBase;
+
+/**
+ * Implementation of {@link AppActionsServiceImplBase} generated from the GRPC proto file. This
+ * class delegates the requests to the appropriate capability session.
+ */
+final class AppInteractionServiceGrpcImpl extends AppActionsServiceImplBase {
+
+    // TODO(b/268069897): Migrate ActionsServiceGrpcImpl.
+    @SuppressWarnings("unused")
+    private final AppInteractionService mAppInteractionService;
+
+    AppInteractionServiceGrpcImpl(AppInteractionService mAppInteractionService) {
+        this.mAppInteractionService = mAppInteractionService;
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppVerificationInfo.kt b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppVerificationInfo.kt
new file mode 100644
index 0000000..90af3ce
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/AppVerificationInfo.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.service
+
+import java.util.Objects
+
+/**
+ * Representation of a client's verified package with a corresponding list of Sha256 signatures.
+ * Used as part of the {@link SecurityPolicy} creation for the grpc service.
+ */
+class AppVerificationInfo
+internal constructor(val packageName: String, val signatures: List<ByteArray>) {
+
+    override fun toString() =
+        "AppVerificationInfo(packageName=$packageName, signaturesSize=$signatures.size)"
+
+    override fun equals(other: Any?): Boolean {
+        return other is AppVerificationInfo &&
+            packageName == other.packageName &&
+            signatures == other.signatures
+    }
+
+    override fun hashCode() = Objects.hash(packageName, signatures)
+
+    /** Builder for constructing an AppVerificationInfo instance. */
+    class Builder {
+        private var packageName: String? = null
+        private var signatures: List<ByteArray> = emptyList()
+
+        /** Set the packageName that will be part of the [AppVerificationInfo] */
+        fun setPackageName(packageName: String) = apply { this.packageName = packageName }
+
+        /** Set the packageName that will be part of the [AppVerificationInfo] */
+        fun addSignature(signatures: List<ByteArray>) = apply { this.signatures = signatures }
+
+        /**
+         * Creates a new instance of [AppVerificationInfo]
+         *
+         * @Throws IllegalArgumentException if packageName is null or signatures are empty.
+         */
+        fun build(): AppVerificationInfo {
+            if (packageName == null) {
+                throw IllegalArgumentException("App verification info packageName is missing.")
+            }
+            if (signatures.isEmpty()) {
+                throw IllegalArgumentException("App verification info signatures are missing.")
+            }
+            return AppVerificationInfo(packageName!!, signatures)
+        }
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/CapabilityExecutionException.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/CapabilityExecutionException.java
new file mode 100644
index 0000000..ffc4686
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/CapabilityExecutionException.java
@@ -0,0 +1,34 @@
+/*
+ * 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.service;
+
+import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
+
+/** Exception that occurs from failure to execute capability when sending fulfillment request. */
+final class CapabilityExecutionException extends RuntimeException {
+
+    private final ErrorStatusInternal mErrorStatus;
+
+    CapabilityExecutionException(ErrorStatusInternal mErrorStatus, String message) {
+        super(message);
+        this.mErrorStatus = mErrorStatus;
+    }
+
+    ErrorStatusInternal getErrorStatus() {
+        return this.mErrorStatus;
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsInternal.kt b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsInternal.kt
new file mode 100644
index 0000000..5dd03ec
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsInternal.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.appactions.interaction.service
+
+import android.util.SizeF
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService.RemoteViewsFactory
+import androidx.annotation.RestrictTo
+
+/** Holder for RemoteViews UI response. */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+internal data class RemoteViewsInternal(
+    val remoteViews: RemoteViews,
+    val size: SizeF,
+    val changedViewIds: HashSet<Int> = HashSet<Int>(),
+    val remoteViewsFactories: HashMap<Int, RemoteViewsFactory> = HashMap<Int, RemoteViewsFactory>()
+) {
+    init {
+        this.changedViewIds.addAll(changedViewIds)
+        this.remoteViewsFactories.putAll(remoteViewsFactories)
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsOverMetadataInterceptor.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsOverMetadataInterceptor.java
new file mode 100644
index 0000000..68866c4
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/RemoteViewsOverMetadataInterceptor.java
@@ -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.
+ */
+
+package androidx.appactions.interaction.service;
+
+import static io.grpc.binder.ParcelableUtils.metadataKey;
+
+import android.widget.RemoteViews;
+
+import androidx.annotation.NonNull;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import io.grpc.Context;
+import io.grpc.Contexts;
+import io.grpc.ForwardingServerCall.SimpleForwardingServerCall;
+import io.grpc.Metadata;
+import io.grpc.ServerCall;
+import io.grpc.ServerCall.Listener;
+import io.grpc.ServerCallHandler;
+import io.grpc.ServerInterceptor;
+import io.grpc.Status;
+
+/**
+ * Server interceptor that copies the RemoteViews provided in context to metadata.
+ *
+ * @hide
+ */
+final class RemoteViewsOverMetadataInterceptor implements ServerInterceptor {
+
+    private static final String KEY = "RemoteViews-bin";
+    static final Metadata.Key<RemoteViews> METADATA_KEY = metadataKey(KEY, RemoteViews.CREATOR);
+    static final Context.Key<AtomicReference<RemoteViews>> RESPONSE = Context.key("RES-" + KEY);
+
+    static void setRemoteViews(@NonNull RemoteViews remoteViews) {
+        RESPONSE.get().set(remoteViews);
+    }
+
+    @Override
+    @NonNull
+    public <ReqT, RespT> Listener<ReqT> interceptCall(
+            @NonNull ServerCall<ReqT, RespT> call,
+            @NonNull Metadata headers,
+            @NonNull ServerCallHandler<ReqT, RespT> next) {
+        Context context = Context.current().withValue(RESPONSE, new AtomicReference<>());
+
+        return Contexts.interceptCall(
+                context,
+                new SimpleForwardingServerCall<ReqT, RespT>(call) {
+                    @Override
+                    public void close(Status status, Metadata trailers) {
+                        RemoteViews value = RESPONSE.get(context).get();
+                        if (value != null) {
+                            trailers.put(METADATA_KEY, value);
+                        }
+                        super.close(status, trailers);
+                    }
+                },
+                headers,
+                next);
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/TileLayoutInternal.kt b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/TileLayoutInternal.kt
new file mode 100644
index 0000000..26bf46d8
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/TileLayoutInternal.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.service
+
+import androidx.annotation.RestrictTo
+import androidx.appactions.interaction.service.proto.AppActionsServiceProto
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.ResourceBuilders
+import com.google.protobuf.ByteString
+
+/** Holder for TileLayout response. */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+internal data class TileLayoutInternal(
+    val layout: LayoutElementBuilders.Layout,
+    val resources: ResourceBuilders.Resources
+) {
+
+    fun toProto(): AppActionsServiceProto.TileLayout {
+        return AppActionsServiceProto.TileLayout.newBuilder()
+            .setLayout(ByteString.copyFrom(layout.toByteArray()))
+            .setResources(ByteString.copyFrom(resources.toByteArray()))
+            .build()
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/UiResponse.kt b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/UiResponse.kt
new file mode 100644
index 0000000..c118e72
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/UiResponse.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.appactions.interaction.service
+
+import android.annotation.SuppressLint
+import android.util.SizeF
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService.RemoteViewsFactory
+import androidx.annotation.IdRes
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.ResourceBuilders
+
+/**
+ * A class representing the UI response being returned to the host. A `UiResponse` cannot be built
+ * directly, it must be built from a [UiResponse] Builder.
+ */
+class UiResponse {
+    internal val remoteViewsInternal: RemoteViewsInternal?
+    internal val tileLayoutInternal: TileLayoutInternal?
+
+    internal constructor(remoteViewsInternal: RemoteViewsInternal) {
+        this.remoteViewsInternal = remoteViewsInternal
+        this.tileLayoutInternal = null
+    }
+
+    internal constructor(tileLayout: TileLayoutInternal) {
+        this.remoteViewsInternal = null
+        this.tileLayoutInternal = tileLayout
+    }
+
+    /** Builder for TileLayouts, used in Wear OS. */
+    class TileLayoutBuilder {
+        private var layout: LayoutElementBuilders.Layout? = null
+        private var resources: ResourceBuilders.Resources? = null
+
+        /**
+         * Sets the [LayoutElementBuilders.Layout] and the associated [ResourceBuilders.Resources]
+         * to be displayed. [RemoteViews] should not be used together with
+         * [LayoutElementBuilders.Layout] in the same session.
+         *
+         * @param layout the wear-tile [LayoutElementBuilders.Layout] to be displayed.
+         * @param resources the resources associated with the layout.
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        fun setTileLayout(
+            layout: LayoutElementBuilders.Layout,
+            resources: ResourceBuilders.Resources
+        ): TileLayoutBuilder {
+            this.layout = layout
+            this.resources = resources
+            return this
+        }
+
+        /** Builds the UiResponse. */
+        fun build() = UiResponse(TileLayoutInternal(layout!!, resources!!))
+    }
+
+    /** Builder for RemoteViews UI response. */
+    class RemoteViewsUiBuilder {
+        private var remoteViews: RemoteViews? = null
+        private var size: SizeF? = null
+        private val changedViewIds: HashSet<Int> = HashSet()
+        private val remoteViewsFactories: HashMap<Int, RemoteViewsFactory> = HashMap()
+
+        /**
+         * Sets the `RemoteViews` to be displayed in the host.
+         *
+         * @param remoteViews the `RemoteViews` to be displayed
+         * @param size the size, in dp, of the RemoteViews being displayed
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        fun setRemoteViews(remoteViews: RemoteViews, size: SizeF?): RemoteViewsUiBuilder {
+            this.remoteViews = remoteViews
+            this.size = size
+            return this
+        }
+
+        /**
+         * Add the specified view ID to the list of changed views for RemoteViews collection update.
+         *
+         * Any errors resulting from the provided view IDs will contain "RemoteViewsCollection
+         * error: " errors with some message from the host.
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        fun addViewIdForCollectionUpdate(@IdRes viewId: Int): RemoteViewsUiBuilder {
+            changedViewIds.add(viewId)
+            return this
+        }
+
+        /**
+         * Implemented to generate the appropriate factories for collection views (e.g. ListView).
+         * Called when the host detects a collection view in the response UI. The
+         * [RemoteViewsFactory] is cached by `viewId` and will be cleared when the session exits.
+         *
+         * @param viewId the id of the collection view
+         * @param factory a RemoteViewsFactory associated with the collection view
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        fun addRemoteViewsFactory(
+            @IdRes viewId: Int,
+            factory: RemoteViewsFactory
+        ): RemoteViewsUiBuilder {
+            remoteViewsFactories.put(viewId, factory)
+            return this
+        }
+
+        /** Builds the UiResponse. */
+        fun build() =
+            UiResponse(
+                RemoteViewsInternal(remoteViews!!, size!!, changedViewIds, remoteViewsFactories)
+            )
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/package-info.java b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/package-info.java
new file mode 100644
index 0000000..026eda8
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/main/java/androidx/appactions/interaction/service/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.appactions.interaction.service;
+
+import androidx.annotation.RestrictTo;
diff --git a/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/ActionCapabilityCallbackTest.java b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/ActionCapabilityCallbackTest.java
new file mode 100644
index 0000000..9fcf205
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/ActionCapabilityCallbackTest.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.appactions.interaction.service;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
+import androidx.appactions.interaction.proto.FulfillmentResponse;
+import androidx.appactions.interaction.proto.FulfillmentResponse.StructuredOutput;
+import androidx.appactions.interaction.proto.ParamValue;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.ExecutionException;
+
+@RunWith(AndroidJUnit4.class)
+public class ActionCapabilityCallbackTest {
+
+    private static final long CB_TIMEOUT = 1000L;
+    private static final FulfillmentResponse RESPONSE =
+            FulfillmentResponse.newBuilder()
+                    .setExecutionOutput(
+                            FulfillmentResponse.StructuredOutput.newBuilder()
+                                    .addOutputValues(
+                                            StructuredOutput.OutputValue.newBuilder()
+                                                    .addValues(
+                                                            ParamValue.newBuilder()
+                                                                    .setStringValue("abcd"))))
+                    .build();
+
+    @Test
+    public void callbackImpl_callbackSuccess_forwardsToCompleter() throws Exception {
+        ListenableFuture<FulfillmentResponse> future =
+                CallbackToFutureAdapter.getFuture(
+                        completer -> {
+                            ActionCapabilityCallback cb = new ActionCapabilityCallback(completer);
+                            cb.onSuccess(RESPONSE);
+                            return "test future";
+                        });
+
+        assertThat(future.get(CB_TIMEOUT, MILLISECONDS)).isEqualTo(RESPONSE);
+    }
+
+    @Test
+    public void callbackImpl_callbackError_failsCompleter() throws Exception {
+        ListenableFuture<FulfillmentResponse> future =
+                CallbackToFutureAdapter.getFuture(
+                        completer -> {
+                            ActionCapabilityCallback cb = new ActionCapabilityCallback(completer);
+                            cb.onError(ErrorStatusInternal.CANCELLED);
+                            return "test future";
+                        });
+
+        assertThat(future.isDone()).isTrue();
+        ExecutionException e =
+                assertThrows(ExecutionException.class, () -> future.get(CB_TIMEOUT, MILLISECONDS));
+        assertThat(e.getCause().getMessage()).isEqualTo("Error executing action capability");
+    }
+}
diff --git a/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/AppVerificationInfoTest.kt b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/AppVerificationInfoTest.kt
new file mode 100644
index 0000000..6b0cfee
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/AppVerificationInfoTest.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.service
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class AppVerificationInfoTest {
+
+    @Test
+    fun builderPattern() {
+        var verificationInfo: AppVerificationInfo =
+            AppVerificationInfo.Builder()
+                .setPackageName("packageName")
+                .addSignature(listOf(ByteArray(5)))
+                .build()
+
+        assertThat(verificationInfo.packageName).isEqualTo("packageName")
+        assertThat(verificationInfo.signatures).hasSize(1)
+    }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/FakeRemoteViewsFactory.kt b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/FakeRemoteViewsFactory.kt
new file mode 100644
index 0000000..c205708
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/FakeRemoteViewsFactory.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.
+ */
+
+package androidx.appactions.interaction.service
+
+import android.os.Build.VERSION
+import android.os.Build.VERSION_CODES
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService.RemoteViewsFactory
+import androidx.appactions.interaction.service.test.R
+
+/** Fake implementation of a RemoteViewsFactory. */
+internal class FakeRemoteViewsFactory : RemoteViewsFactory {
+
+    private val collectionCount = 3
+    private val viewTypeCount = 1
+    private val hasStableIds = true
+    private val packageName = "androidx.appactions.interaction.service"
+
+    override fun onCreate() {
+        // do nothing
+    }
+
+    override fun onDataSetChanged() {
+        // do nothing
+    }
+
+    override fun onDestroy() {
+        // do nothing
+    }
+
+    override fun getCount(): Int {
+        return collectionCount
+    }
+
+    override fun getViewAt(i: Int): RemoteViews {
+        // here we use the position as the view Id, which is the id given to the root of the
+        // RemoteViews. This is just so that we can use getViewId in test to verify that RemoteViews
+        // received is correct.
+        return if (VERSION.SDK_INT >= VERSION_CODES.S) {
+            RemoteViews(packageName, R.layout.remote_view, i)
+        } else RemoteViews(packageName, R.layout.remote_view)
+    }
+
+    override fun getLoadingView(): RemoteViews {
+        return if (VERSION.SDK_INT >= VERSION_CODES.S) {
+            RemoteViews(packageName, R.layout.loading_view)
+        } else RemoteViews(packageName, R.layout.loading_view)
+    }
+
+    override fun getViewTypeCount(): Int {
+        return viewTypeCount
+    }
+
+    override fun getItemId(i: Int): Long {
+        return i.toLong()
+    }
+
+    override fun hasStableIds(): Boolean {
+        return hasStableIds
+    }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/UiResponseTest.kt b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/UiResponseTest.kt
new file mode 100644
index 0000000..e74c4de
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/java/androidx/appactions/interaction/service/UiResponseTest.kt
@@ -0,0 +1,123 @@
+/*
+ * 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.service
+
+import android.content.Context
+import android.util.SizeF
+import android.widget.RemoteViews
+import androidx.appactions.interaction.service.test.R
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.ResourceBuilders
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertThrows
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class UiResponseTest {
+    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val remoteViewsFactoryId = 123
+    private val changeViewId = 111
+
+    @Test
+    fun uiResponse_remoteViewsBuilder_withFactory_success() {
+        val views = RemoteViews(context.packageName, R.layout.remote_view)
+        val uiResponse: UiResponse = UiResponse.RemoteViewsUiBuilder()
+            .setRemoteViews(views, SizeF(10f, 15f))
+            .addRemoteViewsFactory(remoteViewsFactoryId, FakeRemoteViewsFactory())
+            .addViewIdForCollectionUpdate(changeViewId)
+            .build()
+
+        assertThat(uiResponse.tileLayoutInternal).isNull()
+        assertThat(uiResponse.remoteViewsInternal?.size?.width).isEqualTo(10)
+        assertThat(uiResponse.remoteViewsInternal?.size?.height).isEqualTo(15)
+        assertThat(uiResponse.remoteViewsInternal?.remoteViews?.`package`)
+            .isEqualTo(context.packageName)
+        assertThat(uiResponse.remoteViewsInternal?.remoteViewsFactories)
+            .containsKey(remoteViewsFactoryId)
+        assertThat(uiResponse.remoteViewsInternal?.changedViewIds)
+            .containsExactly(changeViewId)
+    }
+
+    @Test
+    fun uiResponse_remoteViewsBuilder_withoutFactory_success() {
+        val views = RemoteViews(context.packageName, R.layout.remote_view)
+        val uiResponse: UiResponse = UiResponse.RemoteViewsUiBuilder()
+            .setRemoteViews(views, SizeF(10f, 15f))
+            .build()
+
+        assertThat(uiResponse.tileLayoutInternal).isNull()
+        assertThat(uiResponse.remoteViewsInternal?.size?.width).isEqualTo(10)
+        assertThat(uiResponse.remoteViewsInternal?.size?.height).isEqualTo(15)
+        assertThat(uiResponse.remoteViewsInternal?.remoteViews?.`package`)
+            .isEqualTo(context.packageName)
+        assertThat(uiResponse.remoteViewsInternal?.changedViewIds).isEmpty()
+    }
+
+    @Test
+    fun uiResponse_remoteViewsBuilder_failure() {
+        assertThrows(
+            NullPointerException::class.java
+        ) { UiResponse.RemoteViewsUiBuilder().build() }
+
+        // No remote views.
+        assertThrows(
+            NullPointerException::class.java
+        ) {
+            UiResponse.RemoteViewsUiBuilder()
+                .addRemoteViewsFactory(remoteViewsFactoryId, FakeRemoteViewsFactory())
+                .addViewIdForCollectionUpdate(changeViewId).build()
+        }
+    }
+
+    @Test
+    fun uiResponse_tileLayoutBuilder_success() {
+        val layout = LayoutElementBuilders.Layout.Builder()
+            .setRoot(
+                LayoutElementBuilders.Box.Builder()
+                    .addContent(
+                        LayoutElementBuilders.Column.Builder()
+                            .addContent(
+                                LayoutElementBuilders.Text.Builder()
+                                    .setText("LA8JE92")
+                                    .build()
+                            )
+                            .build()
+                    )
+                    .build()
+            )
+            .build()
+        val resources = ResourceBuilders.Resources.Builder().setVersion("1234").build()
+        val uiResponse: UiResponse = UiResponse.TileLayoutBuilder()
+            .setTileLayout(layout, resources)
+            .build()
+
+        assertThat(uiResponse.remoteViewsInternal).isNull()
+        assertThat(uiResponse.tileLayoutInternal?.layout).isNotNull()
+        assertThat(uiResponse.tileLayoutInternal?.resources).isNotNull()
+        assertThat(uiResponse.tileLayoutInternal?.toProto()?.layout).isNotEmpty()
+        assertThat(uiResponse.tileLayoutInternal?.toProto()?.resources).isNotEmpty()
+    }
+
+    @Test
+    fun uiResponse_tileLayoutBuilder_failure() {
+        assertThrows(
+            NullPointerException::class.java
+        ) { UiResponse.TileLayoutBuilder().build() }
+    }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-service/src/test/res/layout/loading_view.xml b/appactions/interaction/interaction-service/src/test/res/layout/loading_view.xml
new file mode 100644
index 0000000..306ad28
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/res/layout/loading_view.xml
@@ -0,0 +1,20 @@
+<?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.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"/>
\ No newline at end of file
diff --git a/appactions/interaction/interaction-service/src/test/res/layout/remote_view.xml b/appactions/interaction/interaction-service/src/test/res/layout/remote_view.xml
new file mode 100644
index 0000000..4591475
--- /dev/null
+++ b/appactions/interaction/interaction-service/src/test/res/layout/remote_view.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.
+  -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:text="000"
+        android:textSize="30sp"
+        android:textStyle="bold" />
+</FrameLayout>
\ No newline at end of file
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/build.gradle b/appcompat/appcompat/build.gradle
index a2d862c..44bd7a4 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -30,6 +30,7 @@
     api("androidx.drawerlayout:drawerlayout:1.0.0")
     implementation(projectOrArtifact(":lifecycle:lifecycle-runtime"))
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.5.1")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
     implementation("androidx.resourceinspection:resourceinspection-annotation:1.0.1")
     api("androidx.savedstate:savedstate:1.2.0")
 
@@ -50,12 +51,12 @@
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(projectOrArtifact(":lifecycle:lifecycle-viewmodel"))
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.5.1", {
-	    // Needed to ensure that the same version of lifecycle-runtime-ktx
-	    // is pulled into main and androidTest configurations. Otherwise,
-	    // potentially leads to confusing errors about resolution
-	    // ambiguity, especially from playground build which replaces
-	    // project dependency with snapshot artifacts.
-            exclude group: "androidx.lifecycle", module: "lifecycle-runtime-ktx"
+        // Needed to ensure that the same version of lifecycle-runtime-ktx
+        // is pulled into main and androidTest configurations. Otherwise,
+        // potentially leads to confusing errors about resolution
+        // ambiguity, especially from playground build which replaces
+        // project dependency with snapshot artifacts.
+        exclude group: "androidx.lifecycle", module: "lifecycle-runtime-ktx"
     })
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-appcompat"), {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseKeyEventsTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseKeyEventsTestCase.kt
index 1648e09..673e781 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseKeyEventsTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseKeyEventsTestCase.kt
@@ -98,6 +98,50 @@
     }
 
     @Test
+    @MediumTest
+    fun testBackDismissesActionModeTwice() {
+        with(ActivityScenario.launch(activityClass)) {
+            val destroyed = AtomicBoolean()
+            val scenario = (this as? ActivityScenario<BaseTestActivity>)!!
+            val callback = object : ActionMode.Callback {
+                override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
+                    mode.menuInflater.inflate(R.menu.sample_actions, menu)
+                    return true
+                }
+
+                override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
+                    return false
+                }
+
+                override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
+                    return false
+                }
+
+                override fun onDestroyActionMode(mode: ActionMode) {
+                    destroyed.set(true)
+                }
+            }
+
+            scenario.withActivity {
+                startSupportActionMode(callback)!!
+            }
+
+            pressBack()
+            PollingCheck.waitFor { destroyed.get() }
+
+            // Now try to dismiss the ActionMode a second time
+            destroyed.set(false)
+
+            scenario.withActivity {
+                startSupportActionMode(callback)!!
+            }
+
+            pressBack()
+            PollingCheck.waitFor { destroyed.get() }
+        }
+    }
+
+    @Test
     @LargeTest
     @Throws(InterruptedException::class)
     fun testBackCollapsesActionView() {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesForegroundDialogTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesForegroundDialogTestCase.kt
index 87fed25..97e74d5 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesForegroundDialogTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesForegroundDialogTestCase.kt
@@ -28,6 +28,7 @@
 import androidx.testutils.LifecycleOwnerUtils.waitUntilState
 import junit.framework.TestCase.assertNotSame
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -46,6 +47,7 @@
         baseLocales = LocalesUpdateActivity.getConfigLocales(rule.activity.resources.configuration)
     }
 
+    @Ignore // b/266748759
     @Test
     fun testLocalesChangeWithForegroundDialog() {
         val firstActivity = rule.activity
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index daba672..dca328a 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -378,6 +378,7 @@
                 mBackCallback = Api33Impl.registerOnBackPressedCallback(mDispatcher, this);
             } else if (!shouldRegister && mBackCallback != null) {
                 Api33Impl.unregisterOnBackInvokedCallback(mDispatcher, mBackCallback);
+                mBackCallback = null;
             }
         }
     }
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-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/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..bf470fd 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
@@ -1518,6 +1518,128 @@
     }
 
     @Test
+    public void testQueryIndexableLongProperty_numericSearchEnabledSucceeds() throws Exception {
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.NUMERIC_SEARCH));
+
+        // Schema registration
+        AppSearchSchema transactionSchema = new AppSearchSchema.Builder("transaction")
+                .addProperty(new LongPropertyConfig.Builder("price")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(LongPropertyConfig.INDEXING_TYPE_RANGE)
+                        .build()
+                ).addProperty(new LongPropertyConfig.Builder("cost")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(LongPropertyConfig.INDEXING_TYPE_RANGE)
+                        .build()
+                ).build();
+        mDb1.setSchemaAsync(
+                new SetSchemaRequest.Builder().addSchemas(transactionSchema).build()).get();
+
+        // Index some documents
+        GenericDocument doc1 =
+                new GenericDocument.Builder<>("namespace", "id1", "transaction")
+                        .setPropertyLong("price", 10)
+                        .setCreationTimestampMillis(1000)
+                        .build();
+        GenericDocument doc2 =
+                new GenericDocument.Builder<>("namespace", "id2", "transaction")
+                        .setPropertyLong("price", 25)
+                        .setCreationTimestampMillis(1000)
+                        .build();
+        GenericDocument doc3 =
+                new GenericDocument.Builder<>("namespace", "id3", "transaction")
+                        .setPropertyLong("cost", 2)
+                        .setCreationTimestampMillis(1000)
+                        .build();
+        checkIsBatchResultSuccess(mDb1.putAsync(
+                new PutDocumentsRequest.Builder().addGenericDocuments(doc1, doc2, doc3).build()));
+
+        // Query for the document
+        SearchResults searchResults = mDb1.search("price < 20",
+                new SearchSpec.Builder()
+                        .setNumericSearchEnabled(true)
+                        .build());
+        List<GenericDocument> documents = convertSearchResultsToDocuments(searchResults);
+        assertThat(documents).hasSize(1);
+        assertThat(documents.get(0)).isEqualTo(doc1);
+
+        searchResults = mDb1.search("price == 25",
+                new SearchSpec.Builder()
+                        .setNumericSearchEnabled(true)
+                        .build());
+        documents = convertSearchResultsToDocuments(searchResults);
+        assertThat(documents).hasSize(1);
+        assertThat(documents.get(0)).isEqualTo(doc2);
+
+        searchResults = mDb1.search("cost > 2",
+                new SearchSpec.Builder()
+                        .setNumericSearchEnabled(true)
+                        .build());
+        documents = convertSearchResultsToDocuments(searchResults);
+        assertThat(documents).isEmpty();
+
+        searchResults = mDb1.search("cost >= 2",
+                new SearchSpec.Builder()
+                        .setNumericSearchEnabled(true)
+                        .build());
+        documents = convertSearchResultsToDocuments(searchResults);
+        assertThat(documents).hasSize(1);
+        assertThat(documents.get(0)).isEqualTo(doc3);
+
+        searchResults = mDb1.search("price <= 25",
+                new SearchSpec.Builder()
+                        .setNumericSearchEnabled(true)
+                        .build());
+        documents = convertSearchResultsToDocuments(searchResults);
+        assertThat(documents).hasSize(2);
+        assertThat(documents.get(0)).isEqualTo(doc2);
+        assertThat(documents.get(1)).isEqualTo(doc1);
+    }
+
+    @Test
+    public void testQueryIndexableLongProperty_numericSearchNotEnabled() throws Exception {
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.NUMERIC_SEARCH));
+
+        // Schema registration
+        AppSearchSchema transactionSchema = new AppSearchSchema.Builder("transaction")
+                .addProperty(new LongPropertyConfig.Builder("price")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(LongPropertyConfig.INDEXING_TYPE_RANGE)
+                        .build()
+                ).build();
+        mDb1.setSchemaAsync(
+                new SetSchemaRequest.Builder().addSchemas(transactionSchema).build()).get();
+
+        // Index some documents
+        GenericDocument doc =
+                new GenericDocument.Builder<>("namespace", "id1", "transaction")
+                        .setPropertyLong("price", 10)
+                        .setCreationTimestampMillis(1000)
+                        .build();
+        checkIsBatchResultSuccess(mDb1.putAsync(
+                new PutDocumentsRequest.Builder().addGenericDocuments(doc).build()));
+
+        // TODO(b/208654892); Remove setListFilterQueryLanguageEnabled once advanced query is fully
+        //  supported.
+        // Query for the document
+        // Use advanced query but disable NUMERIC_SEARCH in the SearchSpec.
+        SearchResults searchResults = mDb1.search("price < 20",
+                new SearchSpec.Builder()
+                        .setListFilterQueryLanguageEnabled(true)
+                        .setNumericSearchEnabled(false)
+                        .build());
+
+        Throwable failResult = assertThrows(
+                ExecutionException.class,
+                () -> searchResults.getNextPageAsync().get()).getCause();
+        assertThat(failResult).isInstanceOf(AppSearchException.class);
+        AppSearchException exception = (AppSearchException) failResult;
+        assertThat(exception.getResultCode()).isEqualTo(RESULT_INVALID_ARGUMENT);
+        assertThat(exception).hasMessageThat().contains("Attempted use of unenabled feature");
+        assertThat(exception).hasMessageThat().contains(Features.NUMERIC_SEARCH);
+    }
+
+    @Test
     public void testQuery_relevanceScoring() throws Exception {
         // Schema registration
         mDb1.setSchemaAsync(
@@ -3718,6 +3840,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..4a4af6c 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
@@ -26,7 +26,6 @@
  * the feature will be available forever on that AppSearch storage implementation, at that
  * Android API level, on that device.
  */
-// @exportToFramework:copyToPath(testing/testutils/src/android/app/appsearch/testutil/external/Features.java)
 public interface Features {
 
     /**
@@ -91,7 +90,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..9f951fd 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,45 @@
         return mBundle.getString(ADVANCED_RANKING_EXPRESSION, "");
     }
 
+    /**
+     * Returns whether the {@link Features#NUMERIC_SEARCH} feature is enabled.
+     */
+    public boolean isNumericSearchEnabled() {
+        return getEnabledFeatures().contains(Features.NUMERIC_SEARCH);
+    }
+
+    /**
+     * Returns whether the {@link Features#VERBATIM_SEARCH} feature is enabled.
+     */
+    public boolean isVerbatimSearchEnabled() {
+        return getEnabledFeatures().contains(Features.VERBATIM_SEARCH);
+    }
+
+    /**
+     * Returns whether the {@link Features#LIST_FILTER_QUERY_LANGUAGE} feature is 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 +1269,92 @@
 // @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.
+         *
+         * <p>If disabled, disallows use of
+         * {@link AppSearchSchema.LongPropertyConfig#INDEXING_TYPE_RANGE} and all other numeric
+         * querying features.
+         */
+        // @exportToFramework:startStrip()
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.NUMERIC_SEARCH)
+        // @exportToFramework:endStrip()
+        @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
+         *
+         * <p>If disabled, disallows use of
+         * {@link AppSearchSchema.StringPropertyConfig#TOKENIZER_TYPE_VERBATIM} and all other
+         * verbatim search features within the query language that allows clients to search
+         * using the verbatim string operator.
+         *
+         * <p>Ex. The verbatim string operator '"foo/bar" OR baz' will ensure that 'foo/bar' is
+         * treated as a single 'verbatim' token.
+         */
+        // @exportToFramework:startStrip()
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.VERBATIM_SEARCH)
+        // @exportToFramework:endStrip()
+        @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.
+         *
+         * 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\"))"
+         */
+        // @exportToFramework:startStrip()
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.LIST_FILTER_QUERY_LANGUAGE)
+        // @exportToFramework:endStrip()
+        @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 +1387,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 +1419,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/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPlugin.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPlugin.kt
index 9f0df32..2abd6ef 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPlugin.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPlugin.kt
@@ -16,7 +16,9 @@
 
 package androidx.baselineprofiles.gradle.buildprovider
 
+import androidx.baselineprofiles.gradle.utils.checkAgpVersion
 import androidx.baselineprofiles.gradle.utils.createNonObfuscatedBuildTypes
+import androidx.baselineprofiles.gradle.utils.isGradleSyncRunning
 import com.android.build.api.variant.ApplicationAndroidComponentsExtension
 import org.gradle.api.Plugin
 import org.gradle.api.Project
@@ -25,7 +27,7 @@
  * This is the build provider plugin for baseline profile generation. In order to generate baseline
  * profiles three plugins are needed: one is applied to the app or the library that should consume
  * the baseline profile when building (consumer), one is applied to the project that should supply
- * the test apk (build provider) and the last one is applied to a library module containing the ui
+ * the test apk (build provider) and the last one is applied to a test module containing the ui
  * test that generate the baseline profile on the device (producer).
  *
  * TODO (b/265438721): build provider should be changed to apk provider.
@@ -33,13 +35,61 @@
 class BaselineProfilesBuildProviderPlugin : Plugin<Project> {
 
     override fun apply(project: Project) {
+        var foundAppPlugin = false
         project.pluginManager.withPlugin("com.android.application") {
+            foundAppPlugin = true
             configureWithAndroidPlugin(project = project)
         }
+        var foundLibraryPlugin = false
+        project.pluginManager.withPlugin("com.android.library") {
+            foundLibraryPlugin = true
+        }
+
+        // Only used to verify that the android application plugin has been applied.
+        // Note that we don't want to throw any exception if gradle sync is in progress.
+        project.afterEvaluate {
+            if (!project.isGradleSyncRunning()) {
+                if (!foundAppPlugin) {
+
+                    // Check whether the library plugin was applied instead. If that's the case
+                    // it's possible the developer meant to generate a baseline profile for a
+                    // library and we can give further information.
+                    throw IllegalStateException(
+                        if (!foundLibraryPlugin) {
+                            """
+                    The module ${project.name} does not have the `com.android.application` plugin
+                    applied. The `androidx.baselineprofiles.buildprovider` plugin supports only
+                    android application modules. Please review your build.gradle to ensure this
+                    plugin is applied to the correct module.
+                    """.trimIndent()
+                        } else {
+                            """
+                    The module ${project.name} does not have the `com.android.application` plugin
+                    but has the `com.android.library` plugin. If you're trying to generate a
+                    baseline profile for a library, you'll need to apply the
+                    `androidx.baselineprofiles.buildprovider` to an android application that
+                    has the `com.android.application` plugin applied. This should be a sample app
+                    running the code of the library for which you want to generate the profile.
+                    Please review your build.gradle to ensure this plugin is applied to the
+                    correct module.
+                    """.trimIndent()
+                        }
+                    )
+                }
+                project.logger.debug(
+                    """
+                    [BaselineProfilesBuildProviderPlugin] afterEvaluate check: app plugin was applied
+                    """.trimIndent()
+                )
+            }
+        }
     }
 
     private fun configureWithAndroidPlugin(project: Project) {
 
+        // Checks that the required AGP version is applied to this project.
+        project.checkAgpVersion()
+
         // Create the non obfuscated release build types from the existing release ones.
         // We want to extend all the current release build types based on isDebuggable flag.
         project
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerExtension.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerExtension.kt
index 79a547b..c9b8f44 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerExtension.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerExtension.kt
@@ -16,6 +16,7 @@
 
 package androidx.baselineprofiles.gradle.consumer
 
+import org.gradle.api.Action
 import org.gradle.api.Project
 
 /**
@@ -44,4 +45,136 @@
      * generate baseline profiles.
      */
     var buildTypeName: String = "release"
+
+    /**
+     * Enables on-demand baseline profile generation. Baseline profiles can be generated
+     * periodically or on-demand. Setting this flag to true will enable on-demand generation.
+     * When on-demand generation is enabled the baseline profile is regenerated before building the
+     * release build type. Note that in on-demand mode the baseline profile file is NOT saved in
+     * the `src/<variant>/baselineProfiles` folder, as opposite to the periodic generation where the
+     * latest baseline profile is always stored in the sources.
+     */
+    var onDemandGeneration = false
+
+    /**
+     * When [onDemandGeneration] is off, baseline profiles are stored in the source folders, by
+     * default `src/<variant>/baselineProfiles`. The inner folder can be customized through this
+     * parameter.
+     */
+    var baselineProfileDir = "generatedBaselineProfiles"
+
+    /**
+     * Specifies a filtering rule to decide which profiles rules should be included in this
+     * consumer baseline profile. This is useful especially for libraries, in order to exclude
+     * profile rules for class and methods for dependencies of the sample app. The filter supports:
+     *  - Double wildcards, to match specified package and subpackages. Example: `com.example.**`
+     *  - Wildcards, to match specified package only. Example: `com.example.*`
+     *  - Class names, to match the specified class. Example: `com.example.MyClass`
+     *
+     * Note that when only excludes are specified, if there are no matches with any rule the profile
+     * rule is selected.
+     *
+     * Example to include a package and all the subpackages:
+     * ```
+     *     filter { include "com.somelibrary.**" }
+     * ```
+     *
+     * Example to exclude some packages and include all the rest:
+     * ```
+     *     filter { exclude "com.somelibrary.debug" }
+     * ```
+     *
+     * Example to include and exclude specific packages:
+     * ```
+     *     filter {
+     *          include "com.somelibrary.widget.grid.**"
+     *          exclude "com.somelibrary.widget.grid.debug.**"
+     *          include "com.somelibrary.widget.list.**"
+     *          exclude "com.somelibrary.widget.grid.debug.**"
+     *          include "com.somelibrary.widget.text.**"
+     *          exclude "com.somelibrary.widget.grid.debug.**"
+     *     }
+     * ```
+     *
+     * Filters also support variants and they can be expressed as follows:
+     * ```
+     *     filter { include "com.somelibrary.*" }
+     *     filter("free") { include "com.somelibrary.*" }
+     *     filter("paid") { include "com.somelibrary.*" }
+     *     filter("release") { include "com.somelibrary.*" }
+     *     filter("freeRelease") { include "com.somelibrary.*" }
+     * ```
+     * Filter block without specifying a variant applies to `main`, i.e. all the variants.
+     * Note that when a variant matches multiple filter blocks, all the filters will be merged.
+     * For example with `filter { ... }`, `filter("free") { ... }` and `filter("release") { ... }`
+     * all the blocks will be evaluated for variant `freeRelease` but only `main` and `release` for
+     * variant `paidRelease`.
+     */
+    @JvmOverloads
+    fun filter(variant: String = "main", action: FilterRules.() -> (Unit)) = action
+        .invoke(filterRules.computeIfAbsent(variant) { FilterRules() })
+
+    /**
+     * Specifies a filtering rule to decide which profiles rules should be included in this
+     * consumer baseline profile. This is useful especially for libraries, in order to exclude
+     * profile rules for class and methods for dependencies of the sample app. The filter supports:
+     *  - Double wildcards, to match specified package and subpackages. Example: `com.example.**`
+     *  - Wildcards, to match specified package only. Example: `com.example.*`
+     *  - Class names, to match the specified class. Example: `com.example.MyClass`
+     *
+     * Note that when only excludes are specified, if there are no matches with any rule the profile
+     * rule is selected.
+     *
+     * Example to include a package and all the subpackages:
+     * ```
+     *     filter { include "com.somelibrary.**" }
+     * ```
+     *
+     * Example to exclude some packages and include all the rest:
+     * ```
+     *     filter { exclude "com.somelibrary.debug" }
+     * ```
+     *
+     * Example to include and exclude specific packages:
+     * ```
+     *     filter {
+     *          include "com.somelibrary.widget.grid.**"
+     *          exclude "com.somelibrary.widget.grid.debug.**"
+     *          include "com.somelibrary.widget.list.**"
+     *          exclude "com.somelibrary.widget.list.debug.**"
+     *          include "com.somelibrary.widget.text.**"
+     *          exclude "com.somelibrary.widget.text.debug.**"
+     *     }
+     * ```
+     *
+     * Filters also support variants and they can be expressed as follows:
+     * ```
+     *     filter { include "com.somelibrary.*" }
+     *     filter("free") { include "com.somelibrary.*" }
+     *     filter("paid") { include "com.somelibrary.*" }
+     *     filter("release") { include "com.somelibrary.*" }
+     *     filter("freeRelease") { include "com.somelibrary.*" }
+     * ```
+     * Filter block without specifying a variant applies to `main`, i.e. all the variants.
+     * Note that when a variant matches multiple filter blocks, all the filters will be merged.
+     * For example with `filter { ... }`, `filter("free") { ... }` and `filter("release") { ... }`
+     * all the blocks will be evaluated for variant `freeRelease` but only `main` and `release` for
+     * variant `paidRelease`.
+     */
+    @JvmOverloads
+    fun filter(variant: String = "main", action: Action<FilterRules>) = action
+        .execute(filterRules.computeIfAbsent(variant) { FilterRules() })
+
+    internal val filterRules = mutableMapOf<String, FilterRules>()
+}
+
+class FilterRules {
+    internal val rules = mutableListOf<Pair<RuleType, String>>()
+    fun include(pkg: String) = rules.add(Pair(RuleType.INCLUDE, pkg))
+    fun exclude(pkg: String) = rules.add(Pair(RuleType.EXCLUDE, pkg))
+}
+
+enum class RuleType {
+    INCLUDE,
+    EXCLUDE
 }
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPlugin.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPlugin.kt
index 06b97d9..93f9398 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPlugin.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPlugin.kt
@@ -20,56 +20,84 @@
 import androidx.baselineprofiles.gradle.utils.ATTRIBUTE_CATEGORY_BASELINE_PROFILE
 import androidx.baselineprofiles.gradle.utils.ATTRIBUTE_FLAVOR
 import androidx.baselineprofiles.gradle.utils.CONFIGURATION_NAME_BASELINE_PROFILES
+import androidx.baselineprofiles.gradle.utils.INTERMEDIATES_BASE_FOLDER
 import androidx.baselineprofiles.gradle.utils.camelCase
+import androidx.baselineprofiles.gradle.utils.checkAgpVersion
+import androidx.baselineprofiles.gradle.utils.isGradleSyncRunning
+import androidx.baselineprofiles.gradle.utils.maybeRegister
 import com.android.build.api.variant.AndroidComponentsExtension
-import com.android.build.gradle.AppExtension
-import com.android.build.gradle.LibraryExtension
-import com.android.build.gradle.TestedExtension
+import com.android.build.api.variant.ApplicationAndroidComponentsExtension
+import com.android.build.api.variant.Variant
 import org.gradle.api.Plugin
 import org.gradle.api.Project
+import org.gradle.api.Task
 import org.gradle.api.artifacts.Configuration
 import org.gradle.api.attributes.Category
-import org.gradle.api.tasks.StopExecutionException
+import org.gradle.api.file.Directory
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.TaskProvider
 
 /**
  * This is the consumer plugin for baseline profile generation. In order to generate baseline
  * profiles three plugins are needed: one is applied to the app or the library that should consume
  * the baseline profile when building (consumer), one is applied to the project that should supply
- * the apk under test (build provider) and the last one is applied to a library module containing
+ * the apk under test (build provider) and the last one is applied to a test module containing
  * the ui test that generate the baseline profile on the device (producer).
  */
 class BaselineProfilesConsumerPlugin : Plugin<Project> {
 
     companion object {
-
-        // The output file for the HRF baseline profile file in `src/main`
-        private const val BASELINE_PROFILE_SRC_MAIN_FILENAME = "baseline-prof.txt"
+        private const val GENERATE_TASK_NAME = "generate"
     }
 
     override fun apply(project: Project) {
+        var foundAppOrLibraryPlugin = false
         project.pluginManager.withPlugin("com.android.application") {
-            configureWithAndroidPlugin(project = project, isApplication = true)
+            foundAppOrLibraryPlugin = true
+            configureWithAndroidPlugin(project = project)
         }
         project.pluginManager.withPlugin("com.android.library") {
-            configureWithAndroidPlugin(project = project, isApplication = false)
+            foundAppOrLibraryPlugin = true
+            configureWithAndroidPlugin(project = project)
+        }
+
+        // Only used to verify that the android application plugin has been applied.
+        // Note that we don't want to throw any exception if gradle sync is in progress.
+        project.afterEvaluate {
+            if (!project.isGradleSyncRunning()) {
+                if (!foundAppOrLibraryPlugin) {
+                    throw IllegalStateException(
+                        """
+                    The module ${project.name} does not have the `com.android.application` or
+                    `com.android.library` plugin applied. The `androidx.baselineprofiles.consumer`
+                    plugin supports only android application and library modules. Please review
+                    your build.gradle to ensure this plugin is applied to the correct module.
+                    """.trimIndent()
+                    )
+                }
+                project.logger.debug(
+                    """
+                    [BaselineProfilesConsumerPlugin] afterEvaluate check: app or library plugin
+                    was applied""".trimIndent()
+                )
+            }
         }
     }
 
-    private fun configureWithAndroidPlugin(project: Project, isApplication: Boolean) {
+    private fun configureWithAndroidPlugin(project: Project) {
 
-        // TODO (b/259737859): This code will be updated to use source sets for baseline profiles,
-        //  as soon androidx repo is updated to use AGP 8.0-beta01.
+        // Checks that the required AGP version is applied to this project.
+        project.checkAgpVersion()
 
+        // Prepares extensions used by the plugin
         val androidComponent = project.extensions.getByType(
             AndroidComponentsExtension::class.java
         )
 
-        val baselineProfilesExtension = BaselineProfilesConsumerExtension.registerExtension(project)
+        val baselineProfilesExtension =
+            BaselineProfilesConsumerExtension.registerExtension(project)
 
-        // Creates all the configurations, one per variant.
-        // Note that for this version of the plugin is not possible to rely entirely on the variant
-        // api so the actual creation of the tasks is postponed to be executed when all the
-        // agp tasks have been created, using the old api.
+        // Creates the main baseline profiles configuration
         val mainBaselineProfileConfiguration = createBaselineProfileConfigurationForVariant(
             project,
             variantName = "",
@@ -77,87 +105,145 @@
             buildTypeName = "",
             mainConfiguration = null
         )
-        val baselineProfileConfigurations = mutableListOf<Configuration>()
-        val baselineProfileVariantNames = mutableListOf<String>()
+
+        // Checks that the extended build type exists
+        androidComponent.finalizeDsl {
+            it.buildTypes.findByName(baselineProfilesExtension.buildTypeName)
+                ?: if (!project.isGradleSyncRunning()) {
+                    throw IllegalArgumentException(
+                        """
+                            The build type `${baselineProfilesExtension.buildTypeName}` to generate
+                            baseline profiles does not exist. Please review build.gradle for the
+                            module ${project.name} and specify a release build type.
+                            """.trimIndent()
+                    )
+                } else {
+                    return@finalizeDsl
+                }
+        }
+
+        // This extension exists only if this is an android application module.
+        // If that's the case, we check that we're generating for a non debuggable build type.
+        project
+            .extensions
+            .findByType(ApplicationAndroidComponentsExtension::class.java)
+            ?.finalizeDsl {
+                if (it
+                        .buildTypes
+                        .findByName(baselineProfilesExtension.buildTypeName)
+                        ?.isDebuggable == true
+                ) {
+                    project.logger.warn(
+                        """
+                    The build type `${baselineProfilesExtension.buildTypeName}` to generate baseline
+                    profiles is a debuggable build type. In order to generate a baseline profile is
+                    advisable to utilize a release build type, to include release dependencies.
+                """.trimIndent()
+                    )
+                }
+            }
+
+        // Iterate variants to create per-variant tasks and configurations
         androidComponent.apply {
-            onVariants {
+            onVariants { variant ->
 
                 // Only create configurations for the build type expressed in the baseline profiles
                 // extension. Note that this can be removed after b/265438201.
-                if (it.buildType != baselineProfilesExtension.buildTypeName) {
+                if (variant.buildType != baselineProfilesExtension.buildTypeName) {
                     return@onVariants
                 }
 
-                baselineProfileConfigurations.add(
+                // Creates the configuration to carry the specific variant artifact
+                val baselineProfileConfiguration =
                     createBaselineProfileConfigurationForVariant(
                         project,
-                        variantName = it.name,
-                        flavorName = it.flavorName ?: "",
-                        buildTypeName = it.buildType ?: "",
+                        variantName = variant.name,
+                        flavorName = variant.flavorName ?: "",
+                        buildTypeName = variant.buildType ?: "",
                         mainConfiguration = mainBaselineProfileConfiguration
                     )
+
+                // Creates the task to merge the baseline profile artifacts coming from different
+                // configurations. Note that this is the last task of the chain that triggers the
+                // whole generation, hence it's called `generate`.
+                val genBaselineProfilesTaskProvider = project.tasks.register(
+                    camelCase(GENERATE_TASK_NAME, variant.name, "baselineProfiles"),
+                    GenerateBaselineProfileTask::class.java
+                ) { task ->
+
+                    // These are all the configurations this task depends on, in order to consume their
+                    // artifacts.
+                    task.baselineProfileFileCollection.setFrom(baselineProfileConfiguration)
+
+                    // This is the task output for the generated baseline profile
+                    task.baselineProfileDir.set(
+                        baselineProfilesExtension.baselineProfileOutputDir(
+                            project = project,
+                            variantName = variant.name
+                        )
+                    )
+
+                    // Sets the package filter rules
+                    task.filterRules.set(
+                        baselineProfilesExtension.filterRules
+                            .filter {
+                                it.key in listOfNotNull(
+                                    "main",
+                                    variant.flavorName,
+                                    variant.buildType,
+                                    variant.name
+                                )
+                            }
+                            .flatMap { it.value.rules }
+                    )
+                }
+
+                // The output folders for variant and main profiles are added as source dirs using
+                // source sets api. This cannot be done in the `configure` block of the generation
+                // task. The `onDemand` flag is checked here and the src set folder is chosen
+                // accordingly: if `true`, baseline profiles are saved in the src folder so they
+                // can be committed with srcs, if `false` they're stored in the generated build
+                // files.
+                variant.setBaselineProfileSrcSet(
+                    project = project,
+                    baselineProfilesExtension = baselineProfilesExtension,
+                    genBaselineProfilesTaskProvider = genBaselineProfilesTaskProvider
                 )
 
-                // Save this variant name so later we can use it to set a dependency on the
-                // merge/prepare art profile task for it.
-                baselineProfileVariantNames.add(it.name)
+                // Creates a build and flavor specific tasks, if not existing, to trigger all the
+                // variants for this build or flavor. Note that it's possible for the variant
+                // to be equal to the build type, if no flavor is specified.
+                if (variant.name != variant.buildType) {
+                    maybeCreateParentGenTask(
+                        project,
+                        variant.buildType,
+                        genBaselineProfilesTaskProvider
+                    )
+                }
+                maybeCreateParentGenTask(
+                    project = project,
+                    parentName = variant.flavorName,
+                    childGenerationTaskProvider = genBaselineProfilesTaskProvider
+                )
+                maybeCreateParentGenTask(
+                    project = project,
+                    parentName = "",
+                    childGenerationTaskProvider = genBaselineProfilesTaskProvider
+                )
             }
         }
+    }
 
-        // Now that the configurations are created, the tasks can be created. The consumer plugin
-        // can only be applied to either applications or libraries.
-        // Note that for this plugin does not use the new variant api as it tries to access to some
-        // AGP tasks that don't yet exist in the new variant api callback (b/262007432).
-        val extensionVariants =
-            when (val tested = project.extensions.getByType(TestedExtension::class.java)) {
-                is AppExtension -> tested.applicationVariants
-                is LibraryExtension -> tested.libraryVariants
-                else -> throw StopExecutionException(
-                    """
-                Unrecognized extension: $tested not of type AppExtension or LibraryExtension.
-                """.trimIndent()
-                )
-            }
-
-        // After variants have been resolved and the AGP tasks have been created add the plugin tasks.
-        var applied = false
-        extensionVariants.all {
-            if (applied) return@all
-            applied = true
-
-            // Currently the plugin does not support generating a baseline profile for a specific
-            // flavor: all the flavors are merged into one and copied in src/main/baseline-prof.txt.
-            // This can be changed after b/239659205 when baseline profiles become a source set.
-            val mergeBaselineProfilesTaskProvider = project.tasks.register(
-                "generateBaselineProfiles", MergeBaselineProfileTask::class.java
-            ) { task ->
-
-                // These are all the configurations this task depends on, in order to consume their
-                // artifacts.
-                task.baselineProfileFileCollection.setFrom(baselineProfileConfigurations)
-
-                // This is the output file where all the configurations will be merged in.
-                // Note that this file is overwritten.
-                task.baselineProfileFile.set(
-                    project
-                        .layout
-                        .projectDirectory
-                        .file("src/main/$BASELINE_PROFILE_SRC_MAIN_FILENAME")
-                )
-            }
-
-            // If this is an application the mergeBaselineProfilesTask must run before the
-            // tasks that handle the baseline profile packaging. Merge for applications, prepare
-            // for libraries. Note that this will change with AGP 8.0 that should support
-            // source sets for baseline profiles.
-            for (variantName in baselineProfileVariantNames) {
-                val taskProvider = if (isApplication) {
-                    project.tasks.named(camelCase("merge", variantName, "artProfile"))
-                } else {
-                    project.tasks.named(camelCase("prepare", variantName, "artProfile"))
-                }
-                taskProvider.configure { it.mustRunAfter(mergeBaselineProfilesTaskProvider) }
-            }
+    private fun maybeCreateParentGenTask(
+        project: Project,
+        parentName: String?,
+        childGenerationTaskProvider: TaskProvider<GenerateBaselineProfileTask>
+    ) {
+        if (parentName == null) return
+        project.tasks.maybeRegister<Task>(GENERATE_TASK_NAME, parentName, "baselineProfiles") {
+            it.group = "Baseline Profiles"
+            it.description = "Generates baseline profiles."
+            it.dependsOn(childGenerationTaskProvider)
         }
     }
 
@@ -238,4 +324,61 @@
                 }
             }
     }
+}
+
+fun BaselineProfilesConsumerExtension.baselineProfileOutputDir(
+    project: Project,
+    variantName: String
+): Provider<Directory> =
+    if (onDemandGeneration) {
+
+        // In on demand mode, the baseline profile is regenerated when building
+        // release and it's not saved in the module sources. To achieve this
+        // we can create an intermediate folder for the profile and add the
+        // generation task to src sets.
+        project
+            .layout
+            .buildDirectory
+            .dir("$INTERMEDIATES_BASE_FOLDER/$variantName/")
+    } else {
+
+        // In periodic mode the baseline profile generation is manually triggered.
+        // The baseline profile is stored in the baseline profile sources for
+        // the variant.
+        project.providers.provider {
+            project
+                .layout
+                .projectDirectory
+                .dir("src/$variantName/$baselineProfileDir/")
+        }
+    }
+
+@Suppress("UnstableApiUsage")
+fun Variant.setBaselineProfileSrcSet(
+    project: Project,
+    baselineProfilesExtension: BaselineProfilesConsumerExtension,
+    genBaselineProfilesTaskProvider: TaskProvider<GenerateBaselineProfileTask>,
+) {
+
+    if (baselineProfilesExtension.onDemandGeneration) {
+        this.sources.baselineProfiles?.apply {
+            addGeneratedSourceDirectory(
+                genBaselineProfilesTaskProvider,
+                GenerateBaselineProfileTask::baselineProfileDir
+            )
+        }
+    } else {
+        val baselineProfileSourcesFile = baselineProfilesExtension
+            .baselineProfileOutputDir(project = project, variantName = name)
+            .get()
+            .asFile
+
+        // If the folder does not exist it means that the profile has not been generated
+        // so we don't need to add to sources.
+        if (baselineProfileSourcesFile.exists()) {
+            this.sources.baselineProfiles?.addStaticSourceDirectory(
+                baselineProfileSourcesFile.absolutePath
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/GenerateBaselineProfileTask.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/GenerateBaselineProfileTask.kt
new file mode 100644
index 0000000..0451d11
--- /dev/null
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/GenerateBaselineProfileTask.kt
@@ -0,0 +1,168 @@
+/*
+ * 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.baselineprofiles.gradle.consumer
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+
+/**
+ * Collects all the baseline profile artifacts generated by all the producer configurations and
+ * merges them into one, sorting and ensuring that there are no duplicated lines.
+ *
+ * The format of the profile is a simple list of classes and methods loaded in memory when
+ * executing a test, expressed in JVM format. Duplicates can arise when multiple tests cover the
+ * same code: for example when having 2 tests both covering the startup path and then doing
+ * something else, both will have startup classes and methods. There is no harm in having this
+ * duplication but mostly the profile file will be unnecessarily larger.
+ */
+@CacheableTask
+abstract class GenerateBaselineProfileTask : DefaultTask() {
+
+    companion object {
+
+        // The output file for the HRF baseline profile file in `src/main`
+        private const val BASELINE_PROFILE_FILENAME = "baseline-prof.txt"
+
+        // Regex to match profile rules according to go/jetpack-profile-inception
+        private val PROFILE_RULE_REGEX = "H?S?P?L([^;]*);.*".toRegex()
+    }
+
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NONE)
+    abstract val baselineProfileFileCollection: ConfigurableFileCollection
+
+    @get:Input
+    abstract val filterRules: ListProperty<Pair<RuleType, String>>
+
+    @get:OutputDirectory
+    abstract val baselineProfileDir: DirectoryProperty
+
+    init {
+        group = "Baseline Profiles"
+        description = "Generates baseline profiles."
+    }
+
+    @TaskAction
+    fun exec() {
+
+        // Check if there are no dependencies.
+        if (baselineProfileFileCollection.files.isEmpty()) {
+            throw GradleException(
+                """
+                The baseline profile consumer plugin is applied to this module but no dependency
+                has been set or the added dependencies are not generating any artifact. Please
+                review your build.gradle configuration making sure that a `baselineprofiles`
+                dependency exists and points to a valid `com.android.test` module that has the
+                `androidx.baselineprofiles.producer` plugin applied.
+            """.trimIndent()
+            )
+        }
+
+        // Rules are sorted for package depth and excludes are always evaluated first.
+        val rules = filterRules
+            .get()
+            .sortedWith(
+                compareBy<Pair<RuleType, String>> { r ->
+                    r.second.split(".").size
+                }.thenComparing { r ->
+                    if (r.first == RuleType.INCLUDE) 0 else 1
+                }.reversed()
+            )
+
+        val profileRules = baselineProfileFileCollection.files
+            .flatMap { it.readLines() }
+            .filter {
+
+                // If no rules are specified, always include this line.
+                if (rules.isEmpty()) return@filter true
+
+                // Otherwise rules are evaluated in the order they've been sorted previously.
+                val fullClassName = PROFILE_RULE_REGEX
+                    .replace(it) { res -> res.groupValues[1] }
+                    .split("/")
+                    .joinToString(".")
+
+                for (r in rules) {
+                    if (r.matches(fullClassName)) {
+                        return@filter r.isInclude()
+                    }
+                }
+
+                // If the rules were all excludes and nothing matched, we can include this line
+                // otherwise exclude it.
+                return@filter !rules.any { r -> r.isInclude() }
+            }
+            .toSet()
+
+        if (profileRules.isEmpty()) {
+            throw GradleException(
+                """
+                The baseline profile consumer plugin is configured with filters that exclude all
+                the profile rules. Please review your build.gradle configuration and make sure your
+                filters don't exclude all the baseline profile rules.
+            """.trimIndent()
+            )
+        }
+
+        baselineProfileDir
+            .file(BASELINE_PROFILE_FILENAME)
+            .get()
+            .asFile
+            .writeText(
+                profileRules
+                    .sorted()
+                    .joinToString(System.lineSeparator())
+            )
+    }
+
+    private fun Pair<RuleType, String>.isInclude(): Boolean = first == RuleType.INCLUDE
+    private fun Pair<RuleType, String>.matches(fullClassName: String): Boolean {
+        val rule = second
+        return when {
+            rule.endsWith(".**") -> {
+                // This matches package and subpackages
+                val pkg = fullClassName.split(".").dropLast(1).joinToString(".")
+                val rulePkg = rule.dropLast(3)
+                pkg.startsWith(rulePkg)
+            }
+
+            rule.endsWith(".*") -> {
+                // This matches only the package
+                val pkgParts = fullClassName.split(".").dropLast(1)
+                val pkg = pkgParts.joinToString(".")
+                val rulePkg = rule.dropLast(2)
+                val ruleParts = rulePkg.split(".")
+                pkg.startsWith(rulePkg) && ruleParts.size == pkgParts.size
+            }
+
+            else -> {
+                // This matches only the specific class name
+                fullClassName == rule
+            }
+        }
+    }
+}
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/MergeBaselineProfileTask.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/MergeBaselineProfileTask.kt
deleted file mode 100644
index 2277e63..0000000
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/consumer/MergeBaselineProfileTask.kt
+++ /dev/null
@@ -1,63 +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.baselineprofiles.gradle.consumer
-
-import org.gradle.api.DefaultTask
-import org.gradle.api.file.ConfigurableFileCollection
-import org.gradle.api.file.RegularFileProperty
-import org.gradle.api.tasks.CacheableTask
-import org.gradle.api.tasks.InputFiles
-import org.gradle.api.tasks.OutputFile
-import org.gradle.api.tasks.PathSensitive
-import org.gradle.api.tasks.PathSensitivity
-import org.gradle.api.tasks.TaskAction
-
-/**
- * Collects all the baseline profile artifacts generated by all the producer configurations and
- * merges them into one, sorting and ensuring that there are no duplicated lines.
- *
- * The format of the profile is a simple list of classes and methods loaded in memory when
- * executing a test, expressed in JVM format. Duplicates can arise when multiple tests cover the
- * same code: for example when having 2 tests both covering the startup path and then doing
- * something else, both will have startup classes and methods. There is no harm in having this
- * duplication but mostly the profile file will be unnecessarily larger.
- */
-@CacheableTask
-abstract class MergeBaselineProfileTask : DefaultTask() {
-
-    @get:InputFiles
-    @get:PathSensitive(PathSensitivity.NONE)
-    abstract val baselineProfileFileCollection: ConfigurableFileCollection
-
-    @get:OutputFile
-    abstract val baselineProfileFile: RegularFileProperty
-
-    init {
-        group = "Baseline Profiles"
-        description = "Merges all the baseline profiles into one, removing duplicate lines."
-    }
-
-    @TaskAction
-    fun exec() {
-        val lines = baselineProfileFileCollection.files
-            .flatMap { it.readLines() }
-            .sorted()
-            .distinct()
-
-        baselineProfileFile.get().asFile.writeText(lines.joinToString(System.lineSeparator()))
-    }
-}
\ No newline at end of file
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerExtension.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerExtension.kt
index e1222bf..652e01f 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerExtension.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerExtension.kt
@@ -16,6 +16,7 @@
 
 package androidx.baselineprofiles.gradle.producer
 
+import org.gradle.api.Incubating
 import org.gradle.api.Project
 
 /**
@@ -56,7 +57,14 @@
     var managedDevices = mutableListOf<String>()
 
     /**
-     * Whether baseline profiles should be generated on connected devices.
+     * Whether baseline profiles should be generated on connected devices. Note that in order to
+     * generate a baseline profile, the device is required to be rooted or api level >= 33.
      */
-    var useConnectedDevices: Boolean = true
+    var useConnectedDevices = true
+
+    /**
+     * Enables the emulator display for GMD devices. This is not a stable api.
+     */
+    @Incubating
+    var enableEmulatorDisplay = false
 }
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPlugin.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPlugin.kt
index 0f60d71..de80cf5 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPlugin.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPlugin.kt
@@ -21,9 +21,13 @@
 import androidx.baselineprofiles.gradle.utils.ATTRIBUTE_FLAVOR
 import androidx.baselineprofiles.gradle.utils.BUILD_TYPE_BASELINE_PROFILE_PREFIX
 import androidx.baselineprofiles.gradle.utils.CONFIGURATION_NAME_BASELINE_PROFILES
+import androidx.baselineprofiles.gradle.utils.INTERMEDIATES_BASE_FOLDER
 import androidx.baselineprofiles.gradle.utils.camelCase
+import androidx.baselineprofiles.gradle.utils.checkAgpVersion
 import androidx.baselineprofiles.gradle.utils.createBuildTypeIfNotExists
 import androidx.baselineprofiles.gradle.utils.createNonObfuscatedBuildTypes
+import androidx.baselineprofiles.gradle.utils.isGradleSyncRunning
+import com.android.build.api.dsl.TestBuildType
 import com.android.build.api.variant.TestAndroidComponentsExtension
 import com.android.build.gradle.TestExtension
 import org.gradle.api.GradleException
@@ -36,19 +40,47 @@
  * This is the producer plugin for baseline profile generation. In order to generate baseline
  * profiles three plugins are needed: one is applied to the app or the library that should consume
  * the baseline profile when building (consumer), one is applied to the project that should supply
- * the apk under test (build provider) and the last one is applied to a library module containing
+ * the apk under test (build provider) and the last one is applied to a test module containing
  * the ui test that generate the baseline profile on the device (producer).
  */
 class BaselineProfilesProducerPlugin : Plugin<Project> {
 
+    companion object {
+        private const val COLLECT_TASK_NAME = "collect"
+    }
+
     override fun apply(project: Project) {
+        var foundTestPlugin = false
         project.pluginManager.withPlugin("com.android.test") {
+            foundTestPlugin = true
             configureWithAndroidPlugin(project = project)
         }
+
+        // Only used to verify that the android test plugin has been applied.
+        project.afterEvaluate {
+            if (!project.isGradleSyncRunning()) {
+                if (!foundTestPlugin) {
+                    throw IllegalStateException(
+                        """
+                    The module ${project.name} does not have the `com.android.test` plugin
+                    applied. The `androidx.baselineprofiles.producer` plugin supports only android
+                    test modules. Please review your build.gradle to ensure this plugin is applied
+                    to the correct module.
+                    """.trimIndent()
+                    )
+                }
+                project.logger.debug(
+                    "[BaselineProfilesProducerPlugin] afterEvaluate check: app plugin was applied"
+                )
+            }
+        }
     }
 
     private fun configureWithAndroidPlugin(project: Project) {
 
+        // Checks that the required AGP version is applied to this project.
+        project.checkAgpVersion()
+
         // Prepares extensions used by the plugin
         val baselineProfilesExtension =
             BaselineProfilesProducerExtension.registerExtension(project)
@@ -62,42 +94,51 @@
         testExtension.experimentalProperties["android.experimental.self-instrumenting"] = true
 
         // Creates the new build types to match the build provider. Note that release does not
-        // exist by default so we need to create nonObfuscatedRelease and map it manually to
+        // exist by default so we need to create nonMinifiedRelease and map it manually to
         // `release`. All the existing build types beside `debug`, that is the default one, are
         // added manually in the configuration so we can assume they've been added for the purpose
-        // of generating baseline profiles. We don't need to create a nonObfuscated build type from
-        // `debug`.
+        // of generating baseline profiles. We don't need to create a nonMinified build type from
+        // `debug` since there will be no matching configuration with the apk provider module.
 
         val nonObfuscatedReleaseName = camelCase(BUILD_TYPE_BASELINE_PROFILE_PREFIX, "release")
         val extendedTypeToOriginalTypeMapping = mutableMapOf(nonObfuscatedReleaseName to "release")
 
         testAndroidComponent.finalizeDsl { ext ->
 
+            // The test build types need to be debuggable and have the same singing config key to
+            // be installed. We also disable the test coverage tracking since it's not important
+            // here.
+            val configureBlock: TestBuildType.() -> (Unit) = {
+                isDebuggable = true
+                enableAndroidTestCoverage = false
+                enableUnitTestCoverage = false
+                signingConfig = ext.buildTypes.getByName("debug").signingConfig
+                matchingFallbacks += listOf("release")
+            }
+
+            // The variant names are used by the test module to request a specific apk artifact to
+            // the under test app module (using configuration attributes). This is all handled by
+            // the com.android.test plugin, as long as both modules have the same variants.
+            // Unfortunately the test module cannot determine which variants are present in the
+            // under test app module. As a result we need to replicate the same build types and
+            // flavors, so that the same variant names are created.
             createNonObfuscatedBuildTypes(
                 project = project,
                 extension = ext,
                 extendedBuildTypeToOriginalBuildTypeMapping = extendedTypeToOriginalTypeMapping,
+                configureBlock = configureBlock,
                 filterBlock = {
-                    // TODO: Which build types to skip. In theory we want to skip only debug because
-                    //  it's the default one. All the ones that have been manually added should be
-                    //  considered for this.
+                    // All the build types that have been added to the test module be extended.
+                    // This is because we can't know here which ones are actually release in the
+                    // under test module.
                     it.name != "debug"
                 },
-                configureBlock = {
-                    enableAndroidTestCoverage = false
-                    enableUnitTestCoverage = false
-                },
             )
-
             createBuildTypeIfNotExists(
                 project = project,
                 extension = ext,
                 buildTypeName = nonObfuscatedReleaseName,
-                configureBlock = {
-                    enableAndroidTestCoverage = false
-                    enableUnitTestCoverage = false
-                    matchingFallbacks += listOf("release")
-                }
+                configureBlock = configureBlock
             )
         }
 
@@ -119,17 +160,21 @@
 
                 // Creating configurations only for the extended build types.
                 if (it.buildType == null ||
-                    it.buildType !in extendedTypeToOriginalTypeMapping.keys) {
+                    it.buildType !in extendedTypeToOriginalTypeMapping.keys
+                ) {
                     return@onVariants
                 }
 
+                val flavorName =
+                    if (it.flavorName == null || it.flavorName!!.isEmpty()) null else it.flavorName
+
                 // Creates the configuration to handle this variant. Note that in the attributes
                 // to match the configuration we use the original build type without `nonObfuscated`.
                 val originalBuildTypeName = extendedTypeToOriginalTypeMapping[it.buildType] ?: ""
                 val configurationName = createBaselineProfileConfigurationForVariant(
                     project = project,
                     variantName = it.name,
-                    flavorName = it.flavorName ?: "",
+                    flavorName = flavorName,
                     originalBuildTypeName = originalBuildTypeName
                 )
 
@@ -138,7 +183,7 @@
                     createTasksForVariant(
                         project = project,
                         variantName = it.name,
-                        flavorName = it.flavorName ?: "",
+                        flavorName = flavorName,
                         configurationName = configurationName,
                         baselineProfilesExtension = baselineProfilesExtension
                     )
@@ -159,7 +204,7 @@
     private fun createTasksForVariant(
         project: Project,
         variantName: String,
-        flavorName: String,
+        flavorName: String?,
         configurationName: String,
         baselineProfilesExtension: BaselineProfilesProducerExtension
     ) {
@@ -178,44 +223,67 @@
         // The test task runs the ui tests
         val testTasks = devices.map {
             try {
-                project.tasks.named(camelCase(it, variantName, "androidTest"))
+                project.tasks.named(camelCase(it, variantName, "androidTest")).apply {
+                    configure { t ->
+                        // TODO: this is a bit hack-ish but we can rewrite if we decide to keep the
+                        //  configuration [BaselineProfilesProducerExtension.enableEmulatorDisplay]
+                        if (t.hasProperty("enableEmulatorDisplay")) {
+                            t.setProperty(
+                                "enableEmulatorDisplay",
+                                baselineProfilesExtension.enableEmulatorDisplay
+                            )
+                        }
+                    }
+                }
             } catch (e: UnknownTaskException) {
+
+                // If gradle is syncing don't throw any exception and simply stop here. This plugin
+                // will fail at build time instead. This allows not breaking project sync in ide.
+                if (project.isGradleSyncRunning()) {
+                    return
+                }
+
                 throw GradleException(
                     """
                     It wasn't possible to determine the test task for managed device `$it`.
-                    Please check the managed devices specified in the baseline profiles configuration.
+                    Please check the managed devices specified in the baseline profiles
+                    configuration.
                 """.trimIndent(), e
                 )
             }
         }
 
-        // Merge result protos task
-        val mergeResultProtosTask = project.tasks.named(
-            camelCase("merge", variantName, "testResultProtos")
-        )
-
         // The collect task collects the baseline profile files from the ui test results
         val collectTaskProvider = project.tasks.register(
-            camelCase("collect", variantName, "BaselineProfiles"),
+            camelCase(COLLECT_TASK_NAME, variantName, "BaselineProfiles"),
             CollectBaselineProfilesTask::class.java
         ) {
 
             // Test tasks have to run before collect
-            it.dependsOn(testTasks, mergeResultProtosTask)
+            it.dependsOn(testTasks)
+
+            // Merge result protos task may not exist depending on gradle version
+            val mergeTaskName = camelCase("merge", variantName, "testResultProtos")
+            try {
+                it.dependsOn(project.tasks.named(mergeTaskName))
+            } catch (e: UnknownTaskException) {
+                // Nothing to do.
+                project.logger.info("Task $mergeTaskName does not exist.")
+            }
 
             // Sets flavor name
             it.outputFile.set(
                 project
                     .layout
                     .buildDirectory
-                    .file("intermediates/baselineprofiles/$flavorName/baseline-prof.txt")
+                    .file("$INTERMEDIATES_BASE_FOLDER/$flavorName/baseline-prof.txt")
             )
 
             // Sets the connected test results location, if tests are supposed to run also on
             // connected devices.
             if (shouldExpectConnectedOutput) {
                 it.connectedAndroidTestOutputDir.set(
-                    if (flavorName.isEmpty()) {
+                    if (flavorName == null) {
                         project.layout.buildDirectory
                             .dir("outputs/androidTest-results/connected")
                     } else {
@@ -229,7 +297,7 @@
             // also on managed devices.
             if (shouldExpectManagedOutput) {
                 it.managedAndroidTestOutputDir.set(
-                    if (flavorName.isEmpty()) {
+                    if (flavorName == null) {
                         project.layout.buildDirectory.dir(
                             "outputs/androidTest-results/managedDevice"
                         )
@@ -253,7 +321,7 @@
     private fun createBaselineProfileConfigurationForVariant(
         project: Project,
         variantName: String,
-        flavorName: String,
+        flavorName: String?,
         originalBuildTypeName: String,
     ): String {
         val configurationName =
@@ -264,6 +332,8 @@
                 isCanBeResolved = false
                 isCanBeConsumed = true
                 attributes {
+
+                    // Main specialized attribute
                     it.attribute(
                         Category.CATEGORY_ATTRIBUTE,
                         project.objects.named(
@@ -271,14 +341,14 @@
                             ATTRIBUTE_CATEGORY_BASELINE_PROFILE
                         )
                     )
-                    it.attribute(
-                        ATTRIBUTE_BUILD_TYPE,
-                        originalBuildTypeName
-                    )
-                    it.attribute(
-                        ATTRIBUTE_FLAVOR,
-                        flavorName
-                    )
+
+                    // Build type
+                    it.attribute(ATTRIBUTE_BUILD_TYPE, originalBuildTypeName)
+
+                    // Flavor if existing
+                    if (flavorName != null) {
+                        it.attribute(ATTRIBUTE_FLAVOR, flavorName)
+                    }
                 }
             }
         return configurationName
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Agp.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Agp.kt
new file mode 100644
index 0000000..ce2ce31
--- /dev/null
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Agp.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.baselineprofiles.gradle.utils
+
+import com.android.build.api.variant.AndroidComponentsExtension
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+
+private val gradleSyncProps by lazy {
+    listOf(
+        "android.injected.build.model.v2",
+        "android.injected.build.model.only",
+        "android.injected.build.model.only.advanced",
+    )
+}
+
+internal fun Project.isGradleSyncRunning() =
+    gradleSyncProps.any { it in properties && properties[it].toString().toBoolean() }
+
+internal fun Project.checkAgpVersion() {
+    val extension = project.extensions.findByType(AndroidComponentsExtension::class.java)
+        ?: if (!isGradleSyncRunning()) {
+            throw GradleException(
+                """
+                    The module $name does not have a registered `AndroidComponentsExtension`. This can
+                    only happen if this is not an Android module. Please review your build.gradle to
+                    ensure this plugin is applied to the correct module.
+                """.trimIndent()
+            )
+        } else return
+
+    val agpVersion = extension.pluginVersion
+    if (agpVersion < MIN_AGP_VERSION_REQUIRED || agpVersion > MAX_AGP_VERSION_REQUIRED) {
+        throw GradleException(
+            """
+            This version of the Baseline Profile Gradle Plugin only works with Android Gradle plugin
+            between versions $MIN_AGP_VERSION_REQUIRED and $MAX_AGP_VERSION_REQUIRED. Current version
+            is $agpVersion."
+            """.trimIndent()
+        )
+    }
+}
\ No newline at end of file
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/BuildTypes.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/BuildTypes.kt
index 81dfc24..2146549 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/BuildTypes.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/BuildTypes.kt
@@ -27,16 +27,14 @@
     crossinline configureBlock: T.() -> (Unit),
     extendedBuildTypeToOriginalBuildTypeMapping: MutableMap<String, String>
 ) {
-    extension.buildTypes
-        .filter { buildType ->
+    extension.buildTypes.filter { buildType ->
             if (buildType !is T) {
                 throw GradleException(
                     "Build type `${buildType.name}` is not of type ${T::class}"
                 )
             }
             filterBlock(buildType)
-        }
-        .forEach { buildType ->
+        }.forEach { buildType ->
 
             val newBuildTypeName = camelCase(BUILD_TYPE_BASELINE_PROFILE_PREFIX, buildType.name)
 
@@ -63,7 +61,7 @@
     project: Project,
     extension: CommonExtension<*, T, *, *>,
     buildTypeName: String,
-    configureBlock: BuildType.() -> Unit
+    crossinline configureBlock: T.() -> (Unit),
 ) {
     // Check in case the build type was created manually (to allow full customization)
     if (extension.buildTypes.findByName(buildTypeName) != null) {
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Constants.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Constants.kt
new file mode 100644
index 0000000..70950c7
--- /dev/null
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Constants.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.baselineprofiles.gradle.utils
+
+import com.android.build.api.AndroidPluginVersion
+import org.gradle.api.attributes.Attribute
+
+// Minimum AGP version required
+internal val MIN_AGP_VERSION_REQUIRED = AndroidPluginVersion(8, 0, 0).beta(1)
+internal val MAX_AGP_VERSION_REQUIRED = AndroidPluginVersion(8, 2, 0)
+
+// Prefix for the build type baseline profiles
+internal const val BUILD_TYPE_BASELINE_PROFILE_PREFIX = "nonMinified"
+
+// Configuration consumed by this plugin that carries the baseline profile HRF file.
+internal const val CONFIGURATION_NAME_BASELINE_PROFILES = "baselineprofiles"
+
+// Custom category attribute to match the baseline profile configuration
+internal const val ATTRIBUTE_CATEGORY_BASELINE_PROFILE = "baselineprofile"
+
+// Base folder for artifacts generated by the tasks
+internal const val INTERMEDIATES_BASE_FOLDER = "intermediates/baselineprofiles"
+
+internal val ATTRIBUTE_FLAVOR =
+    Attribute.of("androidx.baselineprofiles.gradle.attributes.Flavor", String::class.java)
+internal val ATTRIBUTE_BUILD_TYPE =
+    Attribute.of("androidx.baselineprofiles.gradle.attributes.BuildType", String::class.java)
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Tasks.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Tasks.kt
new file mode 100644
index 0000000..6be531b
--- /dev/null
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Tasks.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.baselineprofiles.gradle.utils
+
+import org.gradle.api.Task
+import org.gradle.api.UnknownTaskException
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+
+internal inline fun <reified T : Task?> TaskContainer.maybeRegister(
+    vararg nameParts: String,
+    noinline configureBlock: ((T) -> (Unit))? = null
+): TaskProvider<T> {
+    val name = camelCase(*nameParts)
+    return try {
+        val task = named(name, T::class.java)
+        if (configureBlock != null) task.configure(configureBlock)
+        task
+    } catch (e: UnknownTaskException) {
+        register(name, T::class.java, configureBlock)
+    }
+}
\ No newline at end of file
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Utils.kt b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Utils.kt
index 6af0e36..cb41d7c 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Utils.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/main/kotlin/androidx/baselineprofiles/gradle/utils/Utils.kt
@@ -16,31 +16,15 @@
 
 package androidx.baselineprofiles.gradle.utils
 
-import org.gradle.api.attributes.Attribute
 import org.gradle.configurationcache.extensions.capitalized
 
-internal fun camelCase(vararg strings: String): String {
+fun camelCase(vararg strings: String): String {
     if (strings.isEmpty()) return ""
-    return StringBuilder()
-        .apply {
-            var shouldCapitalize = false
-            for (str in strings.filter { it.isNotBlank() }) {
-                append(if (shouldCapitalize) str.capitalized() else str)
-                shouldCapitalize = true
-            }
-        }.toString()
+    return StringBuilder().apply {
+        var shouldCapitalize = false
+        for (str in strings.filter { it.isNotBlank() }) {
+            append(if (shouldCapitalize) str.capitalized() else str)
+            shouldCapitalize = true
+        }
+    }.toString()
 }
-
-// Prefix for the build type baseline profiles
-internal const val BUILD_TYPE_BASELINE_PROFILE_PREFIX = "nonObfuscated"
-
-// Configuration consumed by this plugin that carries the baseline profile HRF file.
-internal const val CONFIGURATION_NAME_BASELINE_PROFILES = "baselineprofiles"
-
-// Custom category attribute to match the baseline profile configuration
-internal const val ATTRIBUTE_CATEGORY_BASELINE_PROFILE = "baselineprofile"
-
-internal val ATTRIBUTE_FLAVOR =
-    Attribute.of("androidx.baselineprofiles.gradle.attributes.Flavor", String::class.java)
-internal val ATTRIBUTE_BUILD_TYPE =
-    Attribute.of("androidx.baselineprofiles.gradle.attributes.BuildType", String::class.java)
\ No newline at end of file
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPluginTest.kt b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPluginTest.kt
index 4c75385..df3ffc6 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPluginTest.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/buildprovider/BaselineProfilesBuildProviderPluginTest.kt
@@ -51,20 +51,21 @@
                 android {
                     namespace 'com.example.namespace'
                 }
-                tasks.register("printNonObfuscatedReleaseBuildType") {
-                    println(android.buildTypes.nonObfuscatedRelease)
+                tasks.register("printBuildType") {
+                    println(android.buildTypes.nonMinifiedRelease)
                 }
             """.trimIndent(),
             suffix = ""
         )
 
-        val buildTypeProperties = gradleRunner
-            .withArguments("printNonObfuscatedReleaseBuildType", "--stacktrace")
+        gradleRunner
+            .withArguments("printBuildType", "--stacktrace")
             .build()
             .output
-
-        assertThat(buildTypeProperties).contains("minifyEnabled=false")
-        assertThat(buildTypeProperties).contains("testCoverageEnabled=false")
-        assertThat(buildTypeProperties).contains("debuggable=false")
+            .also {
+                assertThat(it).contains("minifyEnabled=false")
+                assertThat(it).contains("testCoverageEnabled=false")
+                assertThat(it).contains("debuggable=false")
+            }
     }
 }
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPluginTest.kt b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPluginTest.kt
index 6490dbb..c8460a9 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPluginTest.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/consumer/BaselineProfilesConsumerPluginTest.kt
@@ -64,6 +64,26 @@
             .withPluginClasspath()
     }
 
+    private fun writeDefaultProducerProject() {
+        producerProjectSetup.writeDefaultBuildGradle(
+            prefix = MockProducerBuildGrade()
+                .withConfiguration(flavor = "", buildType = "release")
+                .withProducedBaselineProfiles(
+                    listOf("a", "b", "c", "d"),
+                    flavor = "",
+                    buildType = "release"
+                )
+                .build(),
+            suffix = ""
+        )
+    }
+
+    private fun readBaselineProfileFileContent(variantName: String) =
+        File(
+            consumerProjectSetup.rootDir,
+            "src/$variantName/generatedBaselineProfiles/baseline-prof.txt"
+        ).readLines()
+
     @Test
     fun testGenerateBaselineProfilesTaskWithNoFlavors() {
         consumerProjectSetup.writeDefaultBuildGradle(
@@ -95,9 +115,7 @@
             .build()
 
         // The expected output should have each line sorted descending
-        assertThat(
-            File(consumerProjectSetup.rootDir, "src/main/baseline-prof.txt").readLines()
-        )
+        assertThat(readBaselineProfileFileContent("release"))
             .containsExactly("4", "3", "2", "1")
     }
 
@@ -145,18 +163,227 @@
             suffix = ""
         )
 
+        // Asserts that all per-variant, per-flavor and per-build type tasks are being generated.
+        gradleRunner
+            .withArguments("tasks", "--stacktrace")
+            .build()
+            .output
+            .also {
+                assertThat(it).contains("generateBaselineProfiles - ")
+                assertThat(it).contains("generateFreeBaselineProfiles - ")
+                assertThat(it).contains("generatePaidBaselineProfiles - ")
+                assertThat(it).contains("generateReleaseBaselineProfiles - ")
+            }
+
         gradleRunner
             .withArguments("generateBaselineProfiles", "--stacktrace")
             .build()
 
         // The expected output should have each line sorted ascending
-        val baselineProf =
-            File(consumerProjectSetup.rootDir, "src/main/baseline-prof.txt").readLines()
-        assertThat(baselineProf).containsExactly("1", "2", "3", "4")
+        assertThat(readBaselineProfileFileContent("freeRelease"))
+            .containsExactly("2", "3")
+
+        assertThat(readBaselineProfileFileContent("paidRelease"))
+            .containsExactly("1", "4")
+    }
+
+    @Test
+    fun testPluginAppliedToApplicationModule() {
+
+        // For this test the producer is not important
+        writeDefaultProducerProject()
+
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.application")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+
+        gradleRunner
+            .withArguments("generateBaselineProfiles", "--stacktrace")
+            .build()
+
+        // This should not fail.
+    }
+
+    @Test
+    fun testPluginAppliedToLibraryModule() {
+        // For this test the producer is not important
+        writeDefaultProducerProject()
+
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.library")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+
+        gradleRunner
+            .withArguments("generateBaselineProfiles", "--stacktrace")
+            .build()
+
+        // This should not fail.
+    }
+
+    @Test
+    fun testPluginAppliedToNonApplicationAndNonLibraryModule() {
+        // For this test the producer is not important
+        writeDefaultProducerProject()
+
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.test")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+
+        gradleRunner
+            .withArguments("generateBaselineProfiles", "--stacktrace")
+            .buildAndFail()
+    }
+
+    @Test
+    fun testExtendNonExistingBuildTypeWhenNotSyncing() {
+        // For this test the producer is not important
+        writeDefaultProducerProject()
+
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.application")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+                baselineProfilesProfileConsumer {
+                    buildTypeName = "nonExisting"
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+
+        gradleRunner
+            .withArguments("generateBaselineProfiles", "--stacktrace")
+            .buildAndFail()
+    }
+
+    @Test
+    fun testExtendNonExistingBuildTypeWhenSyncing() {
+        // For this test the producer is not important
+        writeDefaultProducerProject()
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.application")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+                baselineProfilesProfileConsumer {
+                    buildTypeName = "nonExisting"
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+
+        // There is no sync task but any task will do since the check is on the injected property.
+        gradleRunner
+            .withArguments("tasks", "--stacktrace", "-Pandroid.injected.build.model.only=true")
+            .build()
+
+        // This test should not fail as we don't throw exceptions when syncing.
+    }
+
+    @Test
+    fun testBaselineProfilesSrcSetAreAddedToVariants() {
+        consumerProjectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id("com.android.application")
+                    id("androidx.baselineprofiles.consumer")
+                }
+                android {
+                    namespace 'com.example.namespace'
+                    productFlavors {
+                        flavorDimensions = ["version"]
+                        free { dimension "version" }
+                        paid { dimension "version" }
+                    }
+                }
+                dependencies {
+                    baselineprofiles(project(":$producerModuleName"))
+                }
+                android.applicationVariants.all { variant ->
+                    tasks.register(variant.name + "Print") { t ->
+                        println(android.sourceSets[variant.name].baselineProfiles)
+                    }
+                }
+            """.trimIndent(),
+            suffix = ""
+        )
+        producerProjectSetup.writeDefaultBuildGradle(
+            prefix = MockProducerBuildGrade()
+                .withConfiguration(flavor = "free", buildType = "release")
+                .withConfiguration(flavor = "paid", buildType = "release")
+                .withProducedBaselineProfiles(
+                    listOf("3", "2"), flavor = "free", buildType = "release"
+                )
+                .withProducedBaselineProfiles(
+                    listOf("4", "1"), flavor = "paid", buildType = "release"
+                )
+                .build(),
+            suffix = ""
+        )
+        arrayOf("freeRelease", "paidRelease").forEach {
+            assertThat(
+                gradleRunner
+                    .withArguments("${it}Print", "--stacktrace")
+                    .build()
+                    .output
+                    .contains("source=[src/$it/baselineProfiles]")
+            )
+                .isTrue()
+        }
     }
 }
 
-private class MockProducerBuildGrade() {
+private class MockProducerBuildGrade {
 
     private var profileIndex = 0
     private var content = """
diff --git a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPluginTest.kt b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPluginTest.kt
index 2de52a4..0e8a36f 100644
--- a/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPluginTest.kt
+++ b/benchmark/baseline-profiles-gradle-plugin/src/test/kotlin/androidx/baselineprofiles/gradle/producer/BaselineProfilesProducerPluginTest.kt
@@ -84,12 +84,12 @@
                     targetProjectPath = ":$buildProviderModuleName"
                     namespace 'com.example.namespace.test'
                 }
-                tasks.register("mergeNonObfuscatedReleaseTestResultProtos") { println("Stub") }
+                tasks.register("mergeNonMinifiedReleaseTestResultProtos") { println("Stub") }
             """.trimIndent(),
             suffix = ""
         )
 
         val output = gradleRunner.withArguments("tasks", "--stacktrace").build().output
-        assertTrue { output.contains("collectNonObfuscatedReleaseBaselineProfiles - ") }
+        assertTrue { output.contains("collectNonMinifiedReleaseBaselineProfiles - ") }
     }
 }
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/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
index 65ac589..c2348b5 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoSdkHandshakeTest.kt
@@ -47,7 +47,7 @@
 import org.junit.runners.Parameterized
 import org.junit.runners.Parameterized.Parameters
 
-private const val tracingPerfettoVersion = "1.0.0-alpha10" // TODO(224510255): get by 'reflection'
+private const val tracingPerfettoVersion = "1.0.0-alpha11" // TODO(224510255): get by 'reflection'
 private const val minSupportedSdk = Build.VERSION_CODES.R // TODO(234351579): Support API < 30
 
 @RunWith(Parameterized::class)
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/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/CompilationModeTest.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/CompilationModeTest.kt
index f35b192..a1eda85 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/CompilationModeTest.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/CompilationModeTest.kt
@@ -17,6 +17,7 @@
 package androidx.benchmark.integration.macrobenchmark
 
 import android.content.Intent
+import android.os.Build
 import androidx.benchmark.Shell
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.ExperimentalMacrobenchmarkApi
@@ -28,6 +29,7 @@
 import androidx.test.uiautomator.Until
 import androidx.testutils.getStartupMetrics
 import com.google.common.truth.Truth.assertThat
+import org.junit.Assume.assumeTrue
 import org.junit.Rule
 import org.junit.Test
 
@@ -51,8 +53,29 @@
         assertThat(getCompilationMode()).isEqualTo("speed")
     }
 
+    /**
+     * Validate that compilation can be reset.
+     *
+     * Note, this test is skipped on rooted API 29/30, since "cmd package dump" result fails to
+     * update compilation state correctly. Repro:
+     * ```
+     * adb shell cmd package compile -m speed androidx.benchmark.integration.macrobenchmark.target
+     * adb shell cmd package compile --reset androidx.benchmark.integration.macrobenchmark.target
+     * adb shell cmd package dump androidx.benchmark.integration.macrobenchmark.target | grep -A3 Dexopt
+     * ```
+     *
+     * Which prints speed, though it should be 'verify':
+     * ```
+     * Dexopt state:
+     *   [androidx.benchmark.integration.macrobenchmark.target]
+     *     path: /data/app/~~Jn8HSPcIEU6RRXJknWt2ZA==/androidx.benchmark.integration.macrobenchmark.target-CM7MqDZo6wGLb-7Auxqv8g==/base.apk
+     *       arm64: [status=speed] [reason=unknown]
+     * ```
+    */
     @Test
     fun compilationModeNone_shouldSetProfileVerified() {
+        assumeTrue(Build.VERSION.SDK_INT >= 31 || !Shell.isSessionRooted())
+
         // Perform a compilation profile reset and then compile to `speed`.
         runWithCompilationMode(CompilationMode.Full())
 
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/src/main/AndroidManifest.xml b/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
index 1f1625b..0eff47f 100644
--- a/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -18,10 +18,11 @@
         </activity>
     </application>
 
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_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 3066bdc..b177d15 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
@@ -64,8 +64,10 @@
 
         requestBluetoothPermissions.launch(
             arrayOf(
+                Manifest.permission.ACCESS_COARSE_LOCATION,
                 Manifest.permission.ACCESS_FINE_LOCATION,
                 Manifest.permission.BLUETOOTH_ADVERTISE,
+                Manifest.permission.BLUETOOTH_CONNECT,
                 Manifest.permission.BLUETOOTH_SCAN,
             )
         )
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..9513284
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/BluetoothLe.kt
@@ -0,0 +1,253 @@
+/*
+ * 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.bluetooth.le.ScanCallback
+import android.bluetooth.le.ScanResult
+import android.bluetooth.le.ScanSettings
+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 scan(
+        settings: ScanSettings
+    ): Flow<ScanResult> =
+        callbackFlow {
+            val callback = object : ScanCallback() {
+                override fun onScanResult(callbackType: Int, result: ScanResult) {
+                    trySend(result)
+                }
+
+                override fun onScanFailed(errorCode: Int) {
+                    Log.d(TAG, "onScanFailed() called with: errorCode = $errorCode")
+                }
+            }
+
+            val bluetoothAdapter = bluetoothManager?.adapter
+            val bleScanner = bluetoothAdapter?.bluetoothLeScanner
+
+            bleScanner?.startScan(null, settings, callback)
+
+            awaitClose {
+                Log.d(TAG, "awaitClose() called")
+                bleScanner?.stopScan(callback)
+            }
+        }
+
+    // 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 b10253f..bc1e69a 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
@@ -17,14 +17,10 @@
 package androidx.bluetooth.integration.testapp.ui.bluetoothx
 
 import android.annotation.SuppressLint
-import android.bluetooth.BluetoothManager
-import android.bluetooth.le.AdvertiseCallback
 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
@@ -34,6 +30,10 @@
 
 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.common.ScanResultAdapter
 import androidx.bluetooth.integration.testapp.ui.framework.FwkFragment
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
@@ -41,10 +41,6 @@
 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() {
@@ -53,6 +49,10 @@
         const val TAG = "BtxFragment"
     }
 
+    private var scanResultAdapter: ScanResultAdapter? = null
+
+    private lateinit var bluetoothLe: BluetoothLe
+
     private lateinit var btxViewModel: BtxViewModel
 
     private var _binding: FragmentBtxBinding? = null
@@ -78,52 +78,42 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
+        bluetoothLe = BluetoothLe(requireContext())
+
+        scanResultAdapter = ScanResultAdapter { scanResult -> scanResultOnClick(scanResult) }
+        binding.recyclerView.adapter = scanResultAdapter
+
         binding.buttonScan.setOnClickListener {
-            startScan()
+            if (scanJob?.isActive == true) {
+                scanJob?.cancel()
+                binding.buttonScan.text = getString(R.string.scan_using_btx)
+            } else {
+                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
-        advertiseJob?.cancel()
         scanJob?.cancel()
+        advertiseJob?.cancel()
+        gattServerJob?.cancel()
     }
 
     private val scanScope = CoroutineScope(Dispatchers.Main + Job())
     private var scanJob: Job? = null
 
-    // 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)
-            }
-
-            override fun onScanFailed(errorCode: Int) {
-                Log.d(TAG, "scan failed")
-            }
-        }
-
-        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")
 
@@ -132,53 +122,29 @@
             .build()
 
         scanJob = scanScope.launch {
-            Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_LONG)
+            Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_SHORT)
                 .show()
-            scan(scanSettings).take(1).collect {
-                Log.d(TAG, "ScanResult collected")
-            }
+
+            binding.buttonScan.text = getString(R.string.stop_scanning)
+
+            bluetoothLe.scan(scanSettings)
+                .collect {
+                    Log.d(TAG, "ScanResult collected: $it")
+
+                    btxViewModel.scanResults[it.device.address] = it
+                    scanResultAdapter?.submitList(btxViewModel.scanResults.values.toMutableList())
+                    scanResultAdapter?.notifyItemInserted(btxViewModel.scanResults.size)
+                }
         }
     }
 
+    private fun scanResultOnClick(scanResult: ScanResult) {
+        Log.d(TAG, "scanResultOnClick() called with: scanResult = $scanResult")
+    }
+
     private val advertiseScope = CoroutineScope(Dispatchers.Main + Job())
     private var advertiseJob: Job? = null
 
-    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
-    }
-
-    // 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 bluetoothManager =
-                context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
-            val bluetoothAdapter = bluetoothManager?.adapter
-            val bleAdvertiser = bluetoothAdapter?.bluetoothLeAdvertiser
-
-            bleAdvertiser?.startAdvertising(settings, data, callback)
-
-            awaitClose {
-                Log.d(TAG, "awaitClose() called")
-                bleAdvertiser?.stopAdvertising(callback)
-            }
-        }
-
     // Permissions are handled by MainActivity requestBluetoothPermissions
     @SuppressLint("MissingPermission")
     private fun startAdvertise() {
@@ -195,7 +161,7 @@
             .build()
 
         advertiseJob = advertiseScope.launch {
-            advertise(advertiseSettings, advertiseData)
+            bluetoothLe.advertise(advertiseSettings, advertiseData)
                 .collect {
                     Log.d(TAG, "advertiseResult received: $it")
 
@@ -216,4 +182,119 @@
                 }
         }
     }
+
+    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
index 587047c..8e89270 100644
--- 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
@@ -16,6 +16,7 @@
 
 package androidx.bluetooth.integration.testapp.ui.bluetoothx
 
+import android.bluetooth.le.ScanResult
 import android.util.Log
 import androidx.lifecycle.ViewModel
 
@@ -25,6 +26,8 @@
         const val TAG = "BtxViewModel"
     }
 
+    val scanResults = mutableMapOf<String, ScanResult>()
+
     init {
         Log.d(TAG, "init called")
     }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/common/ScanResultAdapter.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/common/ScanResultAdapter.kt
new file mode 100644
index 0000000..ed937a5
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/common/ScanResultAdapter.kt
@@ -0,0 +1,74 @@
+/*
+ * 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.common
+
+import android.bluetooth.le.ScanResult
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+
+import androidx.bluetooth.integration.testapp.R
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+
+class ScanResultAdapter(private val onClick: (ScanResult) -> Unit) :
+    ListAdapter<ScanResult, ScanResultAdapter.ScanResultViewHolder>(ScanResultDiffCallback) {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScanResultViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.scan_result_item, parent, false)
+        return ScanResultViewHolder(view, onClick)
+    }
+
+    override fun onBindViewHolder(holder: ScanResultViewHolder, position: Int) {
+        val scanResult = getItem(position)
+        holder.bind(scanResult)
+    }
+
+    class ScanResultViewHolder(itemView: View, val onClick: (ScanResult) -> Unit) :
+        RecyclerView.ViewHolder(itemView) {
+
+        private val scanResultTextView: TextView = itemView.findViewById(R.id.text_scan_result)
+        private var currentScanResult: ScanResult? = null
+
+        init {
+            itemView.setOnClickListener {
+                currentScanResult?.let {
+                    onClick(it)
+                }
+            }
+        }
+
+        fun bind(scanResult: ScanResult) {
+            currentScanResult = scanResult
+
+            scanResultTextView.text = scanResult.toString()
+        }
+    }
+}
+
+object ScanResultDiffCallback : DiffUtil.ItemCallback<ScanResult>() {
+    override fun areItemsTheSame(oldItem: ScanResult, newItem: ScanResult): Boolean {
+        return oldItem == newItem
+    }
+
+    override fun areContentsTheSame(oldItem: ScanResult, newItem: ScanResult): Boolean {
+        return oldItem.device == newItem.device
+    }
+}
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 d066bbc..42431d7 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
@@ -34,6 +40,7 @@
 import android.widget.Toast
 import androidx.bluetooth.integration.testapp.R
 import androidx.bluetooth.integration.testapp.databinding.FragmentFwkBinding
+import androidx.bluetooth.integration.testapp.ui.common.ScanResultAdapter
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 
@@ -44,12 +51,18 @@
         val ServiceUUID: ParcelUuid = ParcelUuid.fromString("0000b81d-0000-1000-8000-00805f9b34fb")
     }
 
+    private var scanResultAdapter: ScanResultAdapter? = null
+
     private val scanCallback = object : ScanCallback() {
-        override fun onScanResult(callbackType: Int, result: ScanResult?) {
+        override fun onScanResult(callbackType: Int, result: ScanResult) {
             Log.d(TAG, "onScanResult() called with: callbackType = $callbackType, result = $result")
+
+            fwkViewModel.scanResults[result.device.address] = result
+            scanResultAdapter?.submitList(fwkViewModel.scanResults.values.toMutableList())
+            scanResultAdapter?.notifyItemInserted(fwkViewModel.scanResults.size)
         }
 
-        override fun onBatchScanResults(results: MutableList<ScanResult>?) {
+        override fun onBatchScanResults(results: MutableList<ScanResult>) {
             Log.d(TAG, "onBatchScanResults() called with: results = $results")
         }
 
@@ -68,6 +81,8 @@
         }
     }
 
+    private var isScanning = false
+
     private lateinit var fwkViewModel: FwkViewModel
 
     private var _binding: FragmentFwkBinding? = null
@@ -80,8 +95,10 @@
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
-        Log.d(TAG, "onCreateView() called with: inflater = $inflater, " +
-            "container = $container, savedInstanceState = $savedInstanceState")
+        Log.d(
+            TAG, "onCreateView() called with: inflater = $inflater, " +
+                "container = $container, savedInstanceState = $savedInstanceState"
+        )
         fwkViewModel = ViewModelProvider(this)[FwkViewModel::class.java]
 
         _binding = FragmentFwkBinding.inflate(inflater, container, false)
@@ -91,25 +108,38 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
+        scanResultAdapter = ScanResultAdapter { scanResult -> scanResultOnClick(scanResult) }
+        binding.recyclerView.adapter = scanResultAdapter
+
         binding.buttonScan.setOnClickListener {
-            scan()
+            if (isScanning) stopScan()
+            else startScan()
         }
 
         binding.switchAdvertise.setOnCheckedChangeListener { _, isChecked ->
             if (isChecked) startAdvertise()
             else stopAdvertise()
         }
-    }
 
-    override fun onDestroyView() {
-        super.onDestroyView()
-        _binding = null
+        binding.switchGattServer.setOnCheckedChangeListener { _, isChecked ->
+            if (isChecked) openGattServer()
+            else closeGattServer()
+        }
     }
 
     // Permissions are handled by MainActivity requestBluetoothPermissions
     @SuppressLint("MissingPermission")
-    private fun scan() {
-        Log.d(TAG, "scan() called")
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+        stopScan()
+        bluetoothGattServer?.close()
+    }
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun startScan() {
+        Log.d(TAG, "startScan() called")
 
         val bluetoothManager =
             context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
@@ -124,12 +154,37 @@
 
         bleScanner?.startScan(null, scanSettings, scanCallback)
 
-        Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_LONG)
+        isScanning = true
+        binding.buttonScan.text = getString(R.string.stop_scanning)
+
+        Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_SHORT)
             .show()
     }
 
     // Permissions are handled by MainActivity requestBluetoothPermissions
     @SuppressLint("MissingPermission")
+    private fun stopScan() {
+        Log.d(TAG, "stopScan() called")
+
+        val bluetoothManager =
+            context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+
+        val bluetoothAdapter = bluetoothManager?.adapter
+
+        val bleScanner = bluetoothAdapter?.bluetoothLeScanner
+
+        bleScanner?.stopScan(scanCallback)
+
+        isScanning = false
+        _binding?.buttonScan?.text = getString(R.string.scan_using_fwk)
+    }
+
+    private fun scanResultOnClick(scanResult: ScanResult) {
+        Log.d(TAG, "scanResultOnClick() called with: scanResult = $scanResult")
+    }
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
     private fun startAdvertise() {
         Log.d(TAG, "startAdvertise() called")
 
@@ -170,4 +225,154 @@
 
         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
index d72fa738..855f208 100644
--- 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
@@ -16,6 +16,7 @@
 
 package androidx.bluetooth.integration.testapp.ui.framework
 
+import android.bluetooth.le.ScanResult
 import android.util.Log
 import androidx.lifecycle.ViewModel
 import kotlinx.coroutines.CoroutineScope
@@ -32,6 +33,8 @@
         const val TAG = "FwkViewModel"
     }
 
+    val scanResults = mutableMapOf<String, ScanResult>()
+
     init {
         Log.d(TAG, "init called")
     }
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 4bdca3c..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
@@ -21,7 +21,6 @@
     android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingTop="?attr/actionBarSize"
     tools:context=".MainActivity">
 
     <com.google.android.material.bottomnavigation.BottomNavigationView
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 2f53401..ef892a9 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
@@ -20,27 +20,46 @@
     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">
 
-    <androidx.appcompat.widget.SwitchCompat
-        android:id="@+id/switch_advertise"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/advertise_using_btx"
-        android:layout_marginBottom="16dp"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintBottom_toTopOf="@+id/button_scan"
-        app:layout_constraintEnd_toEndOf="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_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="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.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layoutManager="LinearLayoutManager"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/switch_gatt_server"
+        tools:itemCount="3"
+        tools:listitem="@layout/scan_result_item" />
 
 </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 6a72bf2..46c919e 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
@@ -20,27 +20,46 @@
     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">
 
-    <androidx.appcompat.widget.SwitchCompat
-        android:id="@+id/switch_advertise"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/advertise_using_fwk"
-        android:layout_marginBottom="16dp"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintBottom_toTopOf="@+id/button_scan"
-        app:layout_constraintEnd_toEndOf="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_fwk"
-        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="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_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_fwk"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/switch_advertise" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layoutManager="LinearLayoutManager"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/switch_gatt_server"
+        tools:itemCount="3"
+        tools:listitem="@layout/scan_result_item" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/scan_result_item.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/scan_result_item.xml
new file mode 100644
index 0000000..5dc2df1
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/scan_result_item.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.
+  -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/text_scan_result"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        tools:text="canResult{device=1A:52:12:2A:1C:3C, scanRecord=ScanRecord [mAdvertiseFlags=26,
+        mServiceUuids=null, mServiceSolicitationUuids=[], mManufacturerSpecificData={76=[9, 6, 3,
+        -56, 100, 64, 99, -17]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=null]" />
+
+</FrameLayout>
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 170c6a7..7925a2b 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
@@ -23,8 +23,13 @@
     <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 started. Results are in Logcat</string>
+    <string name="stop_scanning">Stop scanning</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/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/src/test/kotlin/androidx/build/metalava/UpdateApiTaskTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/metalava/UpdateApiTaskTest.kt
new file mode 100644
index 0000000..a502b62d
--- /dev/null
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/metalava/UpdateApiTaskTest.kt
@@ -0,0 +1,69 @@
+/*
+ * 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.build.metalava
+
+import org.gradle.api.GradleException
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertThrows
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+
+class UpdateApiTaskTest {
+    @Rule
+    @JvmField
+    val tmpFolder = TemporaryFolder()
+
+    @Test
+    fun testCompareLineCount() {
+        val testCases = mapOf(
+            "No lines" to 0,
+            "Has one\nline" to 1,
+            "Has\ntwo\nlines" to 2,
+            "" to 0,
+            "\n" to 1,
+            "\n\n" to 2
+        )
+
+        for ((text, count) in testCases) {
+            assertEquals(compareLineCount(text, count), 0)
+        }
+    }
+
+    @Test
+    fun testCopyThrowsExceptionOnDiff() {
+        val source = tmpFolder.newFile().apply {
+            writeText("""
+// Signature format: 4.0
+            """.trimIndent())
+        }
+        val dest = tmpFolder.newFile().apply {
+            writeText("""
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+  }
+}
+            """.trimIndent())
+        }
+
+        assertThrows(GradleException::class.java) {
+            copy(source, dest, false)
+        }
+    }
+}
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt
index bc68ffa..47ae5ff 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt
@@ -249,12 +249,6 @@
         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(
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/TestApkSha256ReportTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/TestApkSha256ReportTest.kt
deleted file mode 100644
index b513ba9..0000000
--- a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/TestApkSha256ReportTest.kt
+++ /dev/null
@@ -1,83 +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.build.testConfiguration
-
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TemporaryFolder
-
-class TestApkSha256ReportTest {
-    @get:Rule
-    val temporaryFolder = TemporaryFolder()
-
-    @Test
-    fun writeShaXml() {
-        val file1 = temporaryFolder.newFile(
-            "foo.txt"
-        ).also {
-            it.writeText(
-                "test-file-1"
-            )
-        }
-        // validated via an external tool so we don't rely on what we generate.
-        val file1Sha = "db7bb0ef3ae21cafba57068bab4bcdd5129ba8a25ef5f8c16ad33fc686c7467e"
-        val output = temporaryFolder.newFile("output.xml")
-        val subject = TestApkSha256Report()
-        subject.addFile("renamed.txt", file1)
-        subject.writeToFile(output)
-        assertThat(
-            output.readText(Charsets.UTF_8).trimIndent()
-        ).isEqualTo(
-            """
-            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-            <sha256Report>
-                <file name="renamed.txt" sha256="$file1Sha"/>
-            </sha256Report>
-        """.trimIndent()
-        )
-    }
-
-    @Test
-    fun conflictingFileName() {
-        val file1 = temporaryFolder.newFile(
-            "foo.txt"
-        ).also {
-            it.writeText(
-                "test-file-1"
-            )
-        }
-        val file2 = temporaryFolder.newFile(
-            "foo2.txt"
-        ).also {
-            it.writeText(
-                "test-file-2"
-            )
-        }
-        val subject = TestApkSha256Report()
-        subject.addFile("file1.txt", file1)
-        val result = runCatching {
-            // intentionally use the same name for a different file
-            subject.addFile("file1.txt", file2)
-        }
-        assertThat(
-            result.exceptionOrNull()
-        ).hasMessageThat().contains(
-            "Same file name sent with different sha256 values"
-        )
-    }
-}
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
index 1accf72..1d529cd 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
@@ -157,6 +157,7 @@
                     error.add("MissingColorAlphaChannel")
                     error.add("ModifierFactoryReturnType")
                     error.add("ModifierFactoryExtensionFunction")
+                    error.add("ModifierNodeInspectableProperties")
                     error.add("ModifierParameter")
                     error.add("MutableCollectionMutableState")
                     error.add("UnnecessaryComposedModifier")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
index b5e2ada..cd96eac 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
@@ -134,6 +134,15 @@
         return projectPathsInSameGroup
     }
 
+    /**
+     * Returns a string explaining the value of mavenGroup
+     */
+    fun explainMavenGroup(): List<String> {
+        val explanationBuilder = mutableListOf<String>()
+        chooseLibraryGroup(explanationBuilder)
+        return explanationBuilder
+    }
+
     private fun lazyReadFile(fileName: String): Provider<String> {
         val fileProperty = project.objects.fileProperty().fileValue(
             File(project.getSupportRootFolder(), fileName)
@@ -141,8 +150,8 @@
         return project.providers.fileContents(fileProperty).asText
     }
 
-    private fun chooseLibraryGroup(): LibraryGroup? {
-        return getLibraryGroupFromProjectPath(project.path)
+    private fun chooseLibraryGroup(explanationBuilder: MutableList<String>? = null): LibraryGroup? {
+        return getLibraryGroupFromProjectPath(project.path, explanationBuilder)
     }
 
     private fun substringBeforeLastColon(projectPath: String): String {
@@ -151,30 +160,45 @@
     }
 
     // gets the library group from the project path, including special cases
-    private fun getLibraryGroupFromProjectPath(projectPath: String): LibraryGroup? {
+    private fun getLibraryGroupFromProjectPath(
+        projectPath: String,
+        explanationBuilder: MutableList<String>? = null
+    ): LibraryGroup? {
         val overridden = overrideLibraryGroupsByProjectPath.get(projectPath)
+        if (explanationBuilder != null) {
+            explanationBuilder.add(
+                "Library group (in libraryversions.toml) having" +
+                " overrideInclude=[\"$projectPath\"] is $overridden"
+            )
+        }
         if (overridden != null)
             return overridden
 
-        val result = getStandardLibraryGroupFromProjectPath(projectPath)
+        val result = getStandardLibraryGroupFromProjectPath(projectPath, explanationBuilder)
         if (result != null)
             return result
 
         // samples are allowed to be nested deeper
         if (projectPath.contains("samples")) {
             val parentPath = substringBeforeLastColon(projectPath)
-            return getLibraryGroupFromProjectPath(parentPath)
+            return getLibraryGroupFromProjectPath(parentPath, explanationBuilder)
         }
         return null
     }
 
     // simple function to get the library group from the project path, without special cases
-    private fun getStandardLibraryGroupFromProjectPath(projectPath: String): LibraryGroup? {
+    private fun getStandardLibraryGroupFromProjectPath(
+        projectPath: String,
+        explanationBuilder: MutableList<String>?
+    ): LibraryGroup? {
         // Get the text of the library group, something like "androidx.core"
         val parentPath = substringBeforeLastColon(projectPath)
 
-        if (parentPath == "")
+        if (parentPath == "") {
+            if (explanationBuilder != null)
+                explanationBuilder.add("Parent path for $projectPath is empty")
             return null
+        }
         // convert parent project path to groupId
         val groupIdText = if (projectPath.startsWith(":external")) {
             projectPath.replace(":external:", "")
@@ -183,7 +207,13 @@
         }
 
         // get the library group having that text
-        return libraryGroupsByGroupId.get(groupIdText)
+        val result = libraryGroupsByGroupId.get(groupIdText)
+        if (explanationBuilder != null) {
+            explanationBuilder.add(
+                "Library group (in libraryversions.toml) having group=\"$groupIdText\" is $result"
+            )
+        }
+        return result
     }
 
     private fun chooseProjectVersion() {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 6d46882..b672a80 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -1043,20 +1043,8 @@
  * Guarantees unique names for the APKs, and modifies some of the suffixes. The APK name is used
  * to determine what gets run by our test runner
  */
-fun String.renameApkForTesting(projectPath: String, hasBenchmarkPlugin: Boolean): String {
-    val name =
-        if (projectPath.contains("media") && projectPath.contains("version-compat-tests")) {
-            // Exclude media*:version-compat-tests modules from
-            // existing support library presubmit tests.
-            this.replace("-debug-androidTest", "")
-        } else if (hasBenchmarkPlugin) {
-            this.replace("-androidTest", "-androidBenchmark")
-        } else if (projectPath.endsWith("macrobenchmark")) {
-            this.replace("-androidTest", "-androidMacrobenchmark")
-        } else {
-            this
-        }
-    return "${projectPath.asFilenamePrefix()}_$name"
+fun String.renameApkForTesting(projectPath: String): String {
+    return "${projectPath.asFilenamePrefix()}_$this"
 }
 
 fun Project.hasBenchmarkPlugin(): Boolean {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index 6fd8e08..d9ff238 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -137,7 +137,6 @@
                 buildOnServerTask.dependsOn("${project.path}:jar")
             }
         }
-        project.configureRootProjectForLint()
 
         tasks.register(AndroidXImplPlugin.BUILD_TEST_APKS_TASK)
 
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 6334db6..6cbb153 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -17,7 +17,6 @@
 package androidx.build
 
 import com.android.build.api.dsl.Lint
-import com.android.build.gradle.internal.lint.AndroidLintAnalysisTask
 import com.android.build.gradle.internal.lint.AndroidLintTask
 import java.io.File
 import java.util.Locale
@@ -25,32 +24,8 @@
 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
 
-/**
- * Name of the service we use to limit the number of concurrent executions of lint
- */
-public const val LINT_SERVICE_NAME = "androidxLintService"
-
-// service for limiting the number of concurrent lint tasks
-interface AndroidXLintService : BuildService<BuildServiceParameters.None>
-
-fun Project.configureRootProjectForLint() {
-    // determine many lint tasks to run in parallel
-    val memoryPerTask = 512 * 1024 * 1024
-    val maxLintMemory = Runtime.getRuntime().maxMemory() * 0.75 // save memory for other things too
-    val maxNumParallelUsages = Math.max(1, (maxLintMemory / memoryPerTask).toInt())
-
-    project.gradle.sharedServices.registerIfAbsent(
-        LINT_SERVICE_NAME,
-        AndroidXLintService::class.java
-    ) { spec ->
-        spec.maxParallelUsages.set(maxNumParallelUsages)
-    }
-}
-
 fun Project.configureNonAndroidProjectForLint(extension: AndroidXExtension) {
     apply(mapOf("plugin" to "com.android.lint"))
 
@@ -132,13 +107,6 @@
         checkReleaseBuilds = false
     }
 
-    tasks.withType(AndroidLintAnalysisTask::class.java).configureEach { task ->
-        // don't run too many copies of lint at once due to memory limitations
-        task.usesService(
-            task.project.gradle.sharedServices.registrations.getByName(LINT_SERVICE_NAME).service
-        )
-    }
-
     tasks.withType(AndroidLintTask::class.java).configureEach { task ->
         // Remove the lint and column attributes from generated lint baseline XML.
         if (task.name.startsWith("updateLintBaseline")) {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
index 4e9b6b1e..49a1ff3 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
@@ -128,6 +128,9 @@
     "generateReleaseProtos",
     // Release APKs
     "copyReleaseApk",
+    // The following tests intentionally have the same output of golden images
+    "updateGoldenDesktopTest",
+    "updateGoldenDebugUnitTest"
 )
 
 val taskTypesKnownToDuplicateOutputs = setOf(
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index b7664e3..1531411 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -439,7 +439,10 @@
 
 private fun Project.validateCoordinatesAndGetGroup(extension: AndroidXExtension): LibraryGroup {
     val mavenGroup = extension.mavenGroup
-        ?: throw Exception("You must specify mavenGroup for $name project")
+    if (mavenGroup == null) {
+        val groupExplanation = extension.explainMavenGroup().joinToString("\n")
+        throw Exception("You must specify mavenGroup for $path :\n$groupExplanation")
+    }
     val strippedGroupId = mavenGroup.group.substringAfterLast(".")
     if (
         !extension.bypassCoordinateValidation &&
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/PrintProjectCoordinatesTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/PrintProjectCoordinatesTask.kt
index 04faf70..91ea675 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/PrintProjectCoordinatesTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/PrintProjectCoordinatesTask.kt
@@ -28,6 +28,7 @@
 
     fun configureWithAndroidXExtension(androidXExtension: AndroidXExtension) {
         projectGroup = androidXExtension.mavenGroup
+        groupExplanation = androidXExtension.explainMavenGroup()
         projectName = project.name
         version = project.version.toString()
         projectDir = project.projectDir.relativeTo(project.rootDir)
@@ -38,6 +39,9 @@
     var projectGroup: LibraryGroup? = null
 
     @Internal // Task is always out-of-date: no need to track inputs
+    var groupExplanation: List<String>? = null
+
+    @Internal // Task is always out-of-date: no need to track inputs
     var projectName: String? = null
 
     @Internal // Task is always out-of-date: no need to track inputs
@@ -59,14 +63,19 @@
                 "group.atomicGroupVersion"
             }
 
-        /* ktlint-disable no-multi-spaces */ // easier to read in table format
-        val lines = listOf(
-            listOf("filepath: $projectDir/build.gradle ", "(from settings.gradle)"),
-            listOf("group   : ${projectGroup?.group} ",   "(from AndroidXExtension.kt)"),
-            listOf("artifact: $projectName ",             "(from project name)"),
-            listOf("version : $version ",                 "(from $versionFrom)"),
+        val groupExplanation = groupExplanation!!
+        val lines = mutableListOf(
+            listOf("filepath: $projectDir/build.gradle ", "(from settings.gradle)")
         )
-        /* ktlint-enable no-multi-spaces */
+        // put each component of the explanation on its own line
+        groupExplanation.forEachIndexed { i, component ->
+            if (i == 0)
+                lines.add(listOf("group   : ${projectGroup?.group} ", "$component"))
+            else
+                lines.add(listOf("", "$component"))
+        }
+        lines.add(listOf("artifact: $projectName ", "(from project name)"))
+        lines.add(listOf("version : $version ", "(from $versionFrom)"))
         printTable(lines)
     }
 
@@ -82,7 +91,11 @@
         for (i in 0..(line.size - 1)) {
             val word = line.get(i)
             val columnSize = columnSizes.get(i)
-            result += word.padEnd(columnSize)
+            // only have to pad columns before the last column
+            if (i != line.size - 1)
+                result += word.padEnd(columnSize)
+            else
+                result += word
         }
         return result
     }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
index 407308d..40daa4e 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
@@ -57,7 +57,15 @@
         if (!project.shouldAddGroupConstraints()) {
             doFirst {
                 throw GradleException(
-                    "Cannot publish artifacts without setting -P$ADD_GROUP_CONSTRAINTS=true"
+                    """
+                    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()
                 )
             }
         }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/VersionFileWriterTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
index a81686a..328350a 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
@@ -48,7 +48,7 @@
         val outputFile = File(outputDir.get().asFile, relativePath.get())
         outputFile.parentFile.mkdirs()
         val writer = PrintWriter(outputFile)
-        writer.println(version)
+        writer.println(version.get())
         writer.close()
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
index f3a8727..d827a8d 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
@@ -81,7 +81,11 @@
     }
 }
 
-private fun summarizeDiff(a: File, b: File): String {
+/**
+ * Returns the output of running the `diff` command-line tool on files [a] and [b], truncated to
+ * [maxSummaryLines] lines.
+ */
+fun summarizeDiff(a: File, b: File, maxSummaryLines: Int = 50): String {
     if (!a.exists()) {
         return "$a does not exist"
     }
@@ -93,7 +97,6 @@
         .start()
     process.waitFor(5, TimeUnit.SECONDS)
     var diffLines = process.inputStream.bufferedReader().readLines().toMutableList()
-    val maxSummaryLines = 50
     if (diffLines.size > maxSummaryLines) {
         diffLines = diffLines.subList(0, maxSummaryLines)
         diffLines.plusAssign("[long diff was truncated]")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
index 80a4c17..0286efc 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
@@ -150,7 +150,7 @@
     source: File,
     dest: File,
     permitOverwriting: Boolean,
-    logger: Logger
+    logger: Logger? = null
 ) {
     val sourceText = if (source.exists()) {
         source.readText()
@@ -161,11 +161,18 @@
     val changing = overwriting || (dest.exists() != source.exists())
     if (changing) {
         if (overwriting && !permitOverwriting) {
+            val diff = summarizeDiff(source, dest, maxDiffLines + 1)
+            val diffMsg = if (compareLineCount(diff, maxDiffLines) > 0) {
+                "Diff is greater than $maxDiffLines lines, use diff tool to compare.\n\n"
+            } else {
+                "Diff:\n$diff\n\n"
+            }
             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" +
+                diffMsg +
                 "Did you mean to increment the library version first?\n\n" +
                 "If you have a valid reason to override Semantic Versioning policy, see " +
                 "go/androidx/versioning#beta-api-change for information on obtaining approval."
@@ -174,10 +181,37 @@
         if (source.exists()) {
             @Suppress("UnstableApiUsage")
             Files.copy(source, dest)
-            logger.lifecycle("Copied $source to $dest")
+            logger?.lifecycle("Copied $source to $dest")
         } else {
             dest.delete()
-            logger.lifecycle("Deleted $dest because $source does not exist")
+            logger?.lifecycle("Deleted $dest because $source does not exist")
         }
     }
 }
+
+/**
+ * Returns -1 if [text] has fewer than [count] newline characters, 0 if equal, and 1 if greater
+ * than.
+ */
+fun compareLineCount(text: String, count: Int): Int {
+    var found = 0
+    var index = 0
+    while (found < count) {
+        index = text.indexOf('\n', index)
+        if (index < 0) {
+            break
+        }
+        found++
+        index++
+    }
+    return if (found < count) {
+        -1
+    } else if (found == count) {
+        0
+    } else {
+        1
+    }
+}
+
+/** Maximum number of diff lines to include in output. */
+internal const val maxDiffLines = 8
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
index 89e34eb..8137fdd 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
@@ -50,7 +50,11 @@
         val paparazziNative = project.createUnzippedPaparazziNativeDependency()
         project.afterEvaluate { it.addTestUtilsDependency() }
         project.tasks.register("updateGolden")
-        project.tasks.withType<Test>().configureEach { it.configureTestTask(paparazziNative) }
+        project.afterEvaluate {
+            // need to be inside of afterEvaluate because we read android.namespace
+            // ideally, we refactor to use a lazy API
+            project.tasks.withType<Test>().configureEach { it.configureTestTask(paparazziNative) }
+        }
         project.tasks.withType<Test>().whenTaskAdded { project.registerUpdateGoldenTask(it) }
     }
 
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt
index 52cc075..2630586 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt
@@ -49,11 +49,6 @@
     fun testApkSha256(testApkSha256: String) = apply { this.testApkSha256 = testApkSha256 }
     fun testRunner(testRunner: String) = apply { this.testRunner = testRunner }
 
-    private data class InstrumentationArg(
-        val key: String,
-        val value: String
-    )
-
     fun buildJson(): String {
         val gson = GsonBuilder().setPrettyPrinting().create()
         val instrumentationArgs = if (isBenchmark && !isPostsubmit) {
@@ -77,9 +72,6 @@
             "instrumentationArgs" to instrumentationArgs,
             "additionalApkKeys" to additionalApkKeys
         )
-        if (isBenchmark && !isPostsubmit) {
-            values["instrumentationArgs"]
-        }
         return gson.toJson(values)
     }
 
@@ -106,17 +98,6 @@
             .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))
@@ -138,22 +119,25 @@
 }
 
 class MediaConfigBuilder {
+    lateinit var configName: String
     lateinit var clientApkName: String
+    lateinit var clientApkSha256: 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 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 isPostsubmit(isPostsubmit: Boolean) = apply { this.isPostsubmit = isPostsubmit }
     fun isClientPrevious(isClientPrevious: Boolean) = apply {
         this.isClientPrevious = isClientPrevious
     }
@@ -163,6 +147,9 @@
     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) }
@@ -184,6 +171,41 @@
         }
     }
 
+    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)
@@ -243,6 +265,11 @@
     }
 }
 
+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
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..794ab0f 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
         )
     }
 
@@ -180,37 +224,32 @@
     }
 
     private fun BuiltArtifact.resolveName(path: String): String {
-        return outputFile.substringAfterLast("/")
-            .renameApkForTesting(path, false)
+        return outputFile.substringAfterLast("/").renameApkForTesting(path)
     }
 
     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 +257,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 +266,7 @@
                 }
             }
             ProjectSubset.NONE -> {
-                if (isPresubmit) {
+                if (presubmit.get()) {
                     configBuilder.runAllTests(false)
                 } else {
                     configBuilder.runAllTests(true)
@@ -240,14 +277,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 ee7c132..b043b95 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
@@ -19,9 +19,11 @@
 import androidx.build.dependencyTracker.ProjectSubset
 import androidx.build.renameApkForTesting
 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
+import org.gradle.api.provider.ListProperty
 import org.gradle.api.provider.Property
 import org.gradle.api.tasks.CacheableTask
 import org.gradle.api.tasks.Input
@@ -32,8 +34,6 @@
 import org.gradle.api.tasks.PathSensitive
 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
@@ -94,41 +94,23 @@
     @get:OutputFile
     abstract val outputJson: RegularFileProperty
 
-    /**
-     * Output file where we write the sha256 for each APK file we reference
-     */
-    @get:OutputFile
-    abstract val shaReportOutput: RegularFileProperty
-
     @get:OutputFile
     abstract val constrainedOutputXml: RegularFileProperty
 
-    /**
-     * Output file where we write the sha256 for each APK file we reference in constrained setup
-     */
-    @get:OutputFile
-    abstract val constrainedShaReportOutput: RegularFileProperty
-
     @TaskAction
     fun generateAndroidTestZip() {
-        val testApkSha256Report = TestApkSha256Report()
         writeConfigFileContent(
             outputFile = constrainedOutputXml,
-            testApkSha256Report = testApkSha256Report,
             isConstrained = true,
         )
         writeConfigFileContent(
             outputFile = outputXml,
-            testApkSha256Report = testApkSha256Report,
             isConstrained = false,
         )
-        testApkSha256Report.writeToFile(shaReportOutput.get().asFile)
-        testApkSha256Report.writeToFile(constrainedShaReportOutput.get().asFile)
     }
 
     private fun writeConfigFileContent(
         outputFile: RegularFileProperty,
-        testApkSha256Report: TestApkSha256Report,
         isConstrained: Boolean = false
     ) {
         /*
@@ -144,15 +126,10 @@
                 ?: throw RuntimeException("Cannot load required APK for task: $name")
             // We don't need to check hasBenchmarkPlugin because benchmarks shouldn't have test apps
             val appApkBuiltArtifact = appApk.elements.single()
-            var appName = appApkBuiltArtifact.outputFile.substringAfterLast("/")
-                .renameApkForTesting(appProjectPath.get(), hasBenchmarkPlugin = false)
-            // TODO(b/178776319): Clean up this hardcoded hack
-            if (appProjectPath.get().contains("macrobenchmark-target")) {
-                appName = appName.replace("debug-androidTest", "release")
-            }
+            val appName = appApkBuiltArtifact.outputFile.substringAfterLast("/")
+                .renameApkForTesting(appProjectPath.get())
             configBuilder.appApkName(appName)
                 .appApkSha256(sha256(File(appApkBuiltArtifact.outputFile)))
-            testApkSha256Report.addFile(appName, appApkBuiltArtifact)
         }
         configBuilder.additionalApkKeys(additionalApkKeys.get())
         val isPresubmit = presubmit.get()
@@ -214,13 +191,12 @@
         val testApkBuiltArtifact = testApk.elements.single()
         val testName = testApkBuiltArtifact.outputFile
             .substringAfterLast("/")
-            .renameApkForTesting(testProjectPath.get(), hasBenchmarkPlugin.get())
+            .renameApkForTesting(testProjectPath.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())
@@ -228,7 +204,7 @@
     }
 }
 
-private fun createOrFail(fileProperty: RegularFileProperty): File {
+internal fun createOrFail(fileProperty: RegularFileProperty): File {
     val resolvedFile: File = fileProperty.asFile.get()
     if (!resolvedFile.exists()) {
         if (!resolvedFile.createNewFile()) {
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 0c971b8..7fd7d05 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt
@@ -16,80 +16,9 @@
 
 package androidx.build.testConfiguration
 
-import com.android.build.api.variant.BuiltArtifact
-import com.google.common.annotations.VisibleForTesting
 import com.google.common.hash.Hashing
 import com.google.common.io.BaseEncoding
 import java.io.File
-import java.io.FileOutputStream
-import javax.xml.parsers.DocumentBuilderFactory
-import javax.xml.transform.OutputKeys
-import javax.xml.transform.TransformerFactory
-import javax.xml.transform.dom.DOMSource
-import javax.xml.transform.stream.StreamResult
-
-/**
- * Helper class to record sha256 of APK files referenced in tests.
- *
- * It hashes the files the same way androidx-ci-action does to utilize the APK cache in Google Cloud
- * Storage (GCP). This hashing helps us avoid uploading the same APK multiple times to GCP.
- *
- * https://github.com/androidx/androidx-ci-action/blob/main/AndroidXCI/lib/src/main/kotlin/dev/androidx/ci/util/HashUtil.kt#L21
- */
-@VisibleForTesting
-class TestApkSha256Report {
-    private val files = mutableMapOf<String, String>()
-
-    /**
-     * Adds the given builtArtifact to the list of shas after calculating its sha256 hash.
-     */
-    fun addFile(name: String, builtArtifact: BuiltArtifact) {
-        addFile(name, File(builtArtifact.outputFile))
-    }
-
-    fun addFile(name: String, file: File) {
-        require(file.exists()) {
-            "Cannot find file ${file.path}"
-        }
-        val hash = sha256(file)
-        val existing = files[name]
-        require(existing == null || existing == hash) {
-            "Same file name sent with different sha256 values. $name"
-        }
-        files[name] = hash
-    }
-
-    /**
-     * Writes the [TestApkSha256Report] in XML format into the given [file].
-     */
-    fun writeToFile(file: File) {
-        if (file.exists()) {
-            file.delete()
-        }
-        file.parentFile.mkdirs()
-        val factory = DocumentBuilderFactory.newInstance()
-        val builder = factory.newDocumentBuilder()
-        val doc = builder.newDocument()
-        val root = doc.createElement("sha256Report")
-        doc.appendChild(root)
-        files.entries.sortedBy {
-            it.key
-        }.forEach { (fileName, hash) ->
-            val elm = doc.createElement("file")
-            elm.setAttribute("name", fileName)
-            elm.setAttribute("sha256", hash)
-            root.appendChild(elm)
-        }
-        val transformerFactory = TransformerFactory.newInstance()
-        val transformer = transformerFactory.newTransformer()
-        transformer.setOutputProperty(OutputKeys.INDENT, "yes")
-        val source = DOMSource(doc)
-        FileOutputStream(file).use { fileOutput ->
-            val result = StreamResult(fileOutput)
-            transformer.transform(source, result)
-        }
-    }
-}
 
 @Suppress("UnstableApiUsage") // guava Hashing is marked as @Beta
 internal fun sha256(file: File): String {
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 b890f55..5fcfd54 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
@@ -63,7 +63,6 @@
 ) {
     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
         it.testModules.add(
@@ -84,11 +83,7 @@
         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(
-            File(getConstrainedTestConfigDirectory(), sha256XmlName)
-        )
         task.presubmit.set(isPresubmitBuild())
         // Disable work tests on < API 18: b/178127496
         if (path.startsWith(":work:")) {
@@ -129,25 +124,45 @@
  * Further configures the test config generation task for a project. This only gets called when
  * there is a test app in addition to the instrumentation app, and the only thing it configures is
  * the location of the testapp.
- *
- * @param overrideProject Allows the config task for one project to get registered to an
- * alternative project. Default is for the project to register the new config task to itself
  */
-fun Project.addAppApkToTestConfigGeneration(overrideProject: Project = this) {
-    if (project.isMacrobenchmarkTarget()) {
+fun Project.addAppApkToTestConfigGeneration() {
+    if (isMacrobenchmarkTarget()) {
+        extensions.getByType<ApplicationAndroidComponentsExtension>().apply {
+            onVariants(selector().withBuildType("release")) { appVariant ->
+                getOrCreateMacrobenchmarkConfigTask().configure { configTask ->
+                    configTask.appFolder.set(appVariant.artifacts.get(SingleArtifact.APK))
+                    configTask.appLoader.set(appVariant.artifacts.getBuiltArtifactsLoader())
+                    configTask.appProjectPath.set(path)
+                }
+                if (path == ":benchmark:integration-tests:macrobenchmark-target") {
+                    // Ugly workaround for b/188699825 where we hardcode that
+                    // :benchmark:integration-tests:macrobenchmark-target needs to be installed
+                    // for :benchmark:benchmark-macro tests to work.
+                    project(":benchmark:benchmark-macro").tasks.withType(
+                        GenerateTestConfigurationTask::class.java
+                    ).named(
+                        "${AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK}debugAndroidTest"
+                    ).configure { configTask ->
+                        configTask.appFolder.set(appVariant.artifacts.get(SingleArtifact.APK))
+                        configTask.appLoader.set(appVariant.artifacts.getBuiltArtifactsLoader())
+                        configTask.appProjectPath.set(path)
+                    }
+                }
+            }
+        }
         return
     }
 
     extensions.getByType<ApplicationAndroidComponentsExtension>().apply {
         onVariants(selector().withBuildType("debug")) { appVariant ->
-            overrideProject.tasks.named(
+            tasks.named(
                 AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK +
                     "${appVariant.name}AndroidTest"
             ) { configTask ->
                 configTask as GenerateTestConfigurationTask
                 configTask.appFolder.set(appVariant.artifacts.get(SingleArtifact.APK))
                 configTask.appLoader.set(appVariant.artifacts.getBuiltArtifactsLoader())
-                configTask.appProjectPath.set(overrideProject.path)
+                configTask.appProjectPath.set(path)
             }
         }
     }
@@ -160,12 +175,11 @@
     project.rootProject.tasks.named(ZIP_TEST_CONFIGS_WITH_APKS_TASK) { task ->
         task as Zip
         val projectPath = project.path
-        val hasBenchmarkPlugin = project.providers.provider { project.hasBenchmarkPlugin() }
         task.from(packageTask.outputDirectory) {
             it.include("*.apk")
             it.duplicatesStrategy = DuplicatesStrategy.FAIL
             it.rename { fileName ->
-                fileName.renameApkForTesting(projectPath, hasBenchmarkPlugin.get())
+                fileName.renameApkForTesting(projectPath)
             }
         }
         task.dependsOn(packageTask)
@@ -173,12 +187,11 @@
     project.rootProject.tasks.named(ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK) { task ->
         task as Zip
         val projectPath = project.path
-        val hasBenchmarkPlugin = project.providers.provider { project.hasBenchmarkPlugin() }
         task.from(packageTask.outputDirectory) {
             it.include("*.apk")
             it.duplicatesStrategy = DuplicatesStrategy.FAIL
             it.rename { fileName ->
-                fileName.renameApkForTesting(projectPath, hasBenchmarkPlugin.get())
+                fileName.renameApkForTesting(projectPath)
             }
         }
         task.dependsOn(packageTask)
@@ -236,7 +249,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")) {
@@ -296,16 +308,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)
@@ -315,15 +351,15 @@
     }
 }
 
-private fun Project.getOrCreateMacrobenchmarkConfigTask(variantName: String):
+private fun Project.getOrCreateMacrobenchmarkConfigTask():
     TaskProvider<GenerateTestConfigurationTask> {
-        val parentProject = this.parent!!
+    val parentProject = this.parent!!
     return try {
         parentProject.tasks.withType(GenerateTestConfigurationTask::class.java)
-            .named("${AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK}$variantName")
+            .named(AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK)
     } catch (e: UnknownTaskException) {
         parentProject.tasks.register(
-            "${AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK}$variantName",
+            AndroidXImplPlugin.GENERATE_TEST_CONFIGURATION_TASK,
             GenerateTestConfigurationTask::class.java
         )
     }
@@ -335,70 +371,50 @@
     minSdk: Int,
     testRunner: String
 ) {
-    val configTask = getOrCreateMacrobenchmarkConfigTask(variantName)
-    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(getTestConfigDirectory(), "$fileNamePrefix.xml")
+    val configTask = getOrCreateMacrobenchmarkConfigTask()
+    configTask.configure { task ->
+        val androidXExtension = extensions.getByType<AndroidXExtension>()
+        val fileNamePrefix = path.asFilenamePrefix()
+        task.testFolder.set(artifacts.get(SingleArtifact.APK))
+        task.testLoader.set(artifacts.getBuiltArtifactsLoader())
+        task.additionalApkKeys.set(androidXExtension.additionalDeviceTestApkKeys)
+        task.outputXml.fileValue(
+            File(getTestConfigDirectory(), "$fileNamePrefix$variantName.xml")
+        )
+        task.outputJson.fileValue(
+            File(getTestConfigDirectory(), "$fileNamePrefix$variantName.json")
+        )
+        task.constrainedOutputXml.fileValue(
+            File(
+                getTestConfigDirectory(),
+                "${path.asFilenamePrefix()}$variantName.xml"
             )
-            task.outputJson.fileValue(
-                File(getTestConfigDirectory(), "$fileNamePrefix.json")
-            )
-            task.shaReportOutput.fileValue(
-                File(
-                    this.getTestConfigDirectory(),
-                    "${this.path.asFilenamePrefix()}$variantName$SHA_256_FILE_SUFFIX"
-                )
-            )
-            task.constrainedOutputXml.fileValue(
-                File(
-                    this.getTestConfigDirectory(),
-                    "${this.path.asFilenamePrefix()}$variantName.xml"
-                )
-            )
-            task.constrainedShaReportOutput.fileValue(
-                File(
-                    this.getTestConfigDirectory(),
-                    "${this.path.asFilenamePrefix()}$variantName$SHA_256_FILE_SUFFIX"
-                )
-            )
-            task.minSdk.set(minSdk)
-            task.hasBenchmarkPlugin.set(this.hasBenchmarkPlugin())
-            task.testRunner.set(testRunner)
-            task.testProjectPath.set(this.path)
-            task.presubmit.set(isPresubmitBuild())
-            val detector = AffectedModuleDetector.getInstance(project)
-            task.affectedModuleDetectorSubset.set(
-                project.provider {
-                    detector.getSubset(task)
-                }
-            )
-
-            AffectedModuleDetector.configureTaskGuard(task)
-        }
-        // Disable xml generation for projects that have no test sources
-        afterEvaluate {
-            val androidXExtension = extensions.getByType<AndroidXExtension>()
-            configTask.configure {
-                it.enabled = hasAndroidTestSourceCode() && !androidXExtension.disableDeviceTests
+        )
+        task.minSdk.set(minSdk)
+        task.hasBenchmarkPlugin.set(hasBenchmarkPlugin())
+        task.testRunner.set(testRunner)
+        task.testProjectPath.set(path)
+        task.presubmit.set(isPresubmitBuild())
+        val detector = AffectedModuleDetector.getInstance(project)
+        task.affectedModuleDetectorSubset.set(
+            project.provider {
+                detector.getSubset(task)
             }
-        }
-        this.rootProject.tasks.findByName(ZIP_TEST_CONFIGS_WITH_APKS_TASK)!!
-            .dependsOn(configTask)
-        this.rootProject.tasks.findByName(ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK)!!
-            .dependsOn(configTask)
-    } else if (isMacrobenchmarkTarget()) {
-        configTask.configure { task ->
-            task.appFolder.set(artifacts.get(SingleArtifact.APK))
-            task.appLoader.set(artifacts.getBuiltArtifactsLoader())
-            task.appProjectPath.set(path)
+        )
+
+        AffectedModuleDetector.configureTaskGuard(task)
+    }
+    // Disable xml generation for projects that have no test sources
+    afterEvaluate {
+        val androidXExtension = extensions.getByType<AndroidXExtension>()
+        configTask.configure {
+            it.enabled = hasAndroidTestSourceCode() && !androidXExtension.disableDeviceTests
         }
     }
+    rootProject.tasks.findByName(ZIP_TEST_CONFIGS_WITH_APKS_TASK)!!
+        .dependsOn(configTask)
+    rootProject.tasks.findByName(ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK)!!
+        .dependsOn(configTask)
 }
 
 /**
@@ -409,6 +425,10 @@
 }
 
 fun Project.configureTestConfigGeneration(baseExtension: BaseExtension) {
+    if (isMacrobenchmarkTarget()) {
+        // macrobenchmark target projects use special setup. See addAppApkToTestConfigGeneration
+        return
+    }
     extensions.getByType(AndroidComponentsExtension::class.java).apply {
         onVariants { variant ->
             var name: String? = null
@@ -445,8 +465,7 @@
                         isMedia2 = false
                     )
                 }
-                path.endsWith("macrobenchmark") ||
-                    isMacrobenchmarkTarget() -> {
+                path.endsWith("macrobenchmark") -> {
                     configureMacrobenchmarkConfigTask(
                         name,
                         artifacts,
@@ -466,9 +485,3 @@
         }
     }
 }
-
-/**
- * Suffix to add for xml files which include the SHA256 of referred APKs.
- * see: [TestApkSha256Report].
- */
-private const val SHA_256_FILE_SUFFIX = "-sha256Report.xml"
\ No newline at end of file
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/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 10e7fc0..67f3c4f 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
@@ -401,6 +401,7 @@
     ) = get(option_max_regions) ?: 0
 
     private suspend fun arrangeRequestOptions() {
+        cameraControl.setExposureCompensationIndex(1)
         cameraControl.setZoomRatio(1.0f)
         cameraControl.camera2cameraControl.setCaptureRequestOptions(
             CaptureRequestOptions.Builder().setCaptureRequestOption(
@@ -408,7 +409,6 @@
                 CONTROL_CAPTURE_INTENT_CUSTOM
             ).build()
         ).await()
-        cameraControl.setExposureCompensationIndex(1)[5, TimeUnit.SECONDS]
 
         // Ensure the requests are already set to the CaptureRequest.
         waitForResult().verify(
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EncoderProfilesProviderAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EncoderProfilesProviderAdapterDeviceTest.kt
new file mode 100644
index 0000000..5d6c9c4
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EncoderProfilesProviderAdapterDeviceTest.kt
@@ -0,0 +1,199 @@
+/*
+ * 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.pipe.integration
+
+import android.media.CamcorderProfile
+import android.media.EncoderProfiles.VideoProfile.HDR_NONE
+import android.media.EncoderProfiles.VideoProfile.YUV_420
+import android.os.Build
+import androidx.camera.camera2.pipe.integration.adapter.EncoderProfilesProviderAdapter
+import androidx.camera.camera2.pipe.integration.compat.quirk.DeviceQuirks
+import androidx.camera.camera2.pipe.integration.compat.quirk.InvalidVideoProfilesQuirk
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy.BIT_DEPTH_8
+import androidx.camera.testing.CameraUtil
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class EncoderProfilesProviderAdapterDeviceTest(private val quality: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun data(): Array<Array<Int>> = arrayOf(
+            arrayOf(CamcorderProfile.QUALITY_LOW),
+            arrayOf(CamcorderProfile.QUALITY_HIGH),
+            arrayOf(CamcorderProfile.QUALITY_QCIF),
+            arrayOf(CamcorderProfile.QUALITY_CIF),
+            arrayOf(CamcorderProfile.QUALITY_480P),
+            arrayOf(CamcorderProfile.QUALITY_720P),
+            arrayOf(CamcorderProfile.QUALITY_1080P),
+            arrayOf(CamcorderProfile.QUALITY_QVGA),
+            arrayOf(CamcorderProfile.QUALITY_2160P),
+            arrayOf(CamcorderProfile.QUALITY_VGA),
+            arrayOf(CamcorderProfile.QUALITY_4KDCI),
+            arrayOf(CamcorderProfile.QUALITY_QHD),
+            arrayOf(CamcorderProfile.QUALITY_2K)
+        )
+    }
+
+    private lateinit var encoderProfilesProvider: EncoderProfilesProviderAdapter
+    private var cameraId = ""
+    private var intCameraId = -1
+
+    @get:Rule
+    val useCamera = CameraUtil.grantCameraPermissionAndPreTest()
+
+    @Before
+    fun setup() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+
+        cameraId = CameraUtil.getCameraIdWithLensFacing(CameraSelector.LENS_FACING_BACK)!!
+        intCameraId = cameraId.toInt()
+
+        encoderProfilesProvider = EncoderProfilesProviderAdapter(cameraId)
+    }
+
+    @Test
+    fun hasProfile_returnSameResult() {
+        assertThat(encoderProfilesProvider.hasProfile(quality))
+            .isEqualTo(CamcorderProfile.hasProfile(intCameraId, quality))
+    }
+
+    @Test
+    fun hasProfile_getReturnNonNull() {
+        Assume.assumeTrue(CamcorderProfile.hasProfile(intCameraId, quality))
+
+        assertThat(encoderProfilesProvider.getAll(quality)).isNotNull()
+    }
+
+    @Test
+    fun notHasProfile_getReturnNull() {
+        Assume.assumeTrue(!CamcorderProfile.hasProfile(intCameraId, quality))
+
+        assertThat(encoderProfilesProvider.getAll(quality)).isNull()
+    }
+
+    @Suppress("DEPRECATION")
+    @Test
+    fun hasSameContentAsCamcorderProfile() {
+        Assume.assumeTrue(CamcorderProfile.hasProfile(quality))
+
+        val profile = CamcorderProfile.get(quality)
+        val encoderProfiles = encoderProfilesProvider.getAll(quality)
+        val videoProfile = encoderProfiles!!.videoProfiles[0]
+        val audioProfile = encoderProfiles.audioProfiles[0]
+
+        assertThat(encoderProfiles.defaultDurationSeconds).isEqualTo(profile.duration)
+        assertThat(encoderProfiles.recommendedFileFormat).isEqualTo(profile.fileFormat)
+        assertThat(videoProfile.codec).isEqualTo(profile.videoCodec)
+        assertThat(videoProfile.bitrate).isEqualTo(profile.videoBitRate)
+        assertThat(videoProfile.frameRate).isEqualTo(profile.videoFrameRate)
+        assertThat(videoProfile.width).isEqualTo(profile.videoFrameWidth)
+        assertThat(videoProfile.height).isEqualTo(profile.videoFrameHeight)
+        assertThat(audioProfile.codec).isEqualTo(profile.audioCodec)
+        assertThat(audioProfile.bitrate).isEqualTo(profile.audioBitRate)
+        assertThat(audioProfile.sampleRate).isEqualTo(profile.audioSampleRate)
+        assertThat(audioProfile.channels).isEqualTo(profile.audioChannels)
+    }
+
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 32)
+    @Test
+    fun api31Api32_hasSameContentAsEncoderProfiles() {
+        Assume.assumeTrue(CamcorderProfile.hasProfile(quality))
+
+        val profiles = CamcorderProfile.getAll(cameraId, quality)
+        val video = profiles!!.videoProfiles[0]
+        val audio = profiles.audioProfiles[0]
+        val profilesProxy = encoderProfilesProvider.getAll(quality)
+        val videoProxy = profilesProxy!!.videoProfiles[0]
+        val audioProxy = profilesProxy.audioProfiles[0]
+
+        assertThat(profilesProxy.defaultDurationSeconds).isEqualTo(profiles.defaultDurationSeconds)
+        assertThat(profilesProxy.recommendedFileFormat).isEqualTo(profiles.recommendedFileFormat)
+        assertThat(videoProxy.codec).isEqualTo(video.codec)
+        assertThat(videoProxy.mediaType).isEqualTo(video.mediaType)
+        assertThat(videoProxy.bitrate).isEqualTo(video.bitrate)
+        assertThat(videoProxy.frameRate).isEqualTo(video.frameRate)
+        assertThat(videoProxy.width).isEqualTo(video.width)
+        assertThat(videoProxy.height).isEqualTo(video.height)
+        assertThat(videoProxy.profile).isEqualTo(video.profile)
+        assertThat(videoProxy.bitDepth).isEqualTo(BIT_DEPTH_8)
+        assertThat(videoProxy.chromaSubsampling).isEqualTo(YUV_420)
+        assertThat(videoProxy.hdrFormat).isEqualTo(HDR_NONE)
+        assertThat(audioProxy.codec).isEqualTo(audio.codec)
+        assertThat(audioProxy.mediaType).isEqualTo(audio.mediaType)
+        assertThat(audioProxy.bitrate).isEqualTo(audio.bitrate)
+        assertThat(audioProxy.sampleRate).isEqualTo(audio.sampleRate)
+        assertThat(audioProxy.channels).isEqualTo(audio.channels)
+        assertThat(audioProxy.profile).isEqualTo(audio.profile)
+    }
+
+    @SdkSuppress(minSdkVersion = 33)
+    @Test
+    fun afterApi33_hasSameContentAsEncoderProfiles() {
+        Assume.assumeTrue(CamcorderProfile.hasProfile(quality))
+        skipTestOnDevicesWithProblematicBuild()
+
+        val profiles = CamcorderProfile.getAll(cameraId, quality)
+        val video = profiles!!.videoProfiles[0]
+        val audio = profiles.audioProfiles[0]
+        val profilesProxy = encoderProfilesProvider.getAll(quality)
+        val videoProxy = profilesProxy!!.videoProfiles[0]
+        val audioProxy = profilesProxy.audioProfiles[0]
+
+        assertThat(profilesProxy.defaultDurationSeconds).isEqualTo(profiles.defaultDurationSeconds)
+        assertThat(profilesProxy.recommendedFileFormat).isEqualTo(profiles.recommendedFileFormat)
+        assertThat(videoProxy.codec).isEqualTo(video.codec)
+        assertThat(videoProxy.mediaType).isEqualTo(video.mediaType)
+        assertThat(videoProxy.bitrate).isEqualTo(video.bitrate)
+        assertThat(videoProxy.frameRate).isEqualTo(video.frameRate)
+        assertThat(videoProxy.width).isEqualTo(video.width)
+        assertThat(videoProxy.height).isEqualTo(video.height)
+        assertThat(videoProxy.profile).isEqualTo(video.profile)
+        assertThat(videoProxy.bitDepth).isEqualTo(video.bitDepth)
+        assertThat(videoProxy.chromaSubsampling).isEqualTo(video.chromaSubsampling)
+        assertThat(videoProxy.hdrFormat).isEqualTo(video.hdrFormat)
+        assertThat(audioProxy.codec).isEqualTo(audio.codec)
+        assertThat(audioProxy.mediaType).isEqualTo(audio.mediaType)
+        assertThat(audioProxy.bitrate).isEqualTo(audio.bitrate)
+        assertThat(audioProxy.sampleRate).isEqualTo(audio.sampleRate)
+        assertThat(audioProxy.channels).isEqualTo(audio.channels)
+        assertThat(audioProxy.profile).isEqualTo(audio.profile)
+    }
+
+    private fun skipTestOnDevicesWithProblematicBuild() {
+        // Skip test for b/265613005 and b/223439995
+        val hasVideoProfilesQuirk = DeviceQuirks[InvalidVideoProfilesQuirk::class.java] != null
+        val isProblematicCuttlefishBuild =
+            Build.MODEL.contains("Cuttlefish") && Build.ID.startsWith("TP1A")
+        Assume.assumeFalse(
+            "Skip test with null VideoProfile issue. Unable to test.",
+            hasVideoProfilesQuirk || isProblematicCuttlefishBuild
+        )
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/UseCaseSurfaceManagerDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/UseCaseSurfaceManagerDeviceTest.kt
index 65e72dc..b6ba0b18 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/UseCaseSurfaceManagerDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/UseCaseSurfaceManagerDeviceTest.kt
@@ -41,11 +41,9 @@
 import androidx.camera.testing.activity.Camera2TestActivity
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfig
-import androidx.camera.testing.waitForIdle
 import androidx.core.os.HandlerCompat
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.IdlingResource
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -149,8 +147,15 @@
         assertThat(cameraClosedUsageCount).isEqualTo(1)
     }
 
+    /**
+     * This test launches another (test) Activity with the intention of taking away camera from the
+     * test itself. On Android T and above, we listen to onCameraAccessPrioritiesChanged() and
+     * retries opening the camera when the camera is disconnected. That means the test activity will
+     * no longer deterministically get the final camera access on Android T and above. As such, we
+     * set the maximum SDK version to S_V2.
+     */
     @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M, maxSdkVersion = Build.VERSION_CODES.S_V2)
     fun disconnectOpenedCameraGraph_deferrableSurfaceUsageCountTest() = runBlocking {
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
 
@@ -194,9 +199,13 @@
                 putExtra(Camera2TestActivity.EXTRA_CAMERA_ID, cameraId)
             }
         ).use {
-            lateinit var previewReady: IdlingResource
-            it.onActivity { activity -> previewReady = activity.mPreviewReady!! }
-            previewReady.waitForIdle()
+            // TODO(b/268768235): Under some conditions, it is possible that the camera gets
+            //  disconnected for both the foreground and test activity, before the preview has a
+            //  chance to be ready. Fix it with follow-up changes to change this test by using a
+            //  CameraGraphSimulator rather than a real CameraGraph.
+            // lateinit var previewReady: IdlingResource
+            // it.onActivity { activity -> previewReady = activity.mPreviewReady!! }
+            // previewReady.waitForIdle()
 
             cameraDisconnectedUsageCount = testSessionParameters.deferrableSurface.useCount
         }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CamcorderProfileProviderAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CamcorderProfileProviderAdapter.kt
deleted file mode 100644
index b75b73d..0000000
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CamcorderProfileProviderAdapter.kt
+++ /dev/null
@@ -1,93 +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.camera.camera2.pipe.integration.adapter
-
-import android.media.CamcorderProfile
-import android.os.Build
-import androidx.annotation.Nullable
-import androidx.annotation.RequiresApi
-import androidx.camera.core.Logger
-import androidx.camera.core.impl.CamcorderProfileProvider
-import androidx.camera.core.impl.CamcorderProfileProxy
-
-/**
- * Adapt the [CamcorderProfileProvider] interface to [CameraPipe].
- */
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-class CamcorderProfileProviderAdapter(cameraIdString: String) : CamcorderProfileProvider {
-    private val hasValidCameraId: Boolean
-    private val cameraId: Int
-
-    init {
-        var hasValidCameraId = false
-        var intCameraId = -1
-        try {
-            intCameraId = cameraIdString.toInt()
-            hasValidCameraId = true
-        } catch (e: NumberFormatException) {
-            Logger.w(
-                TAG,
-                "Camera id is not an integer: " +
-                    "$cameraIdString, unable to create CamcorderProfileProvider"
-            )
-        }
-        this.hasValidCameraId = hasValidCameraId
-        cameraId = intCameraId
-
-        // TODO(b/241296464): CamcorderProfileResolutionQuirk and CamcorderProfileResolutionValidator
-    }
-
-    override fun hasProfile(quality: Int): Boolean {
-        if (!hasValidCameraId) {
-            return false
-        }
-        return CamcorderProfile.hasProfile(cameraId, quality)
-        // TODO: b241296464 CamcorderProfileResolutionQuirk and
-        // CamcorderProfileResolutionValidator. If has quick, check if the proxy profile has
-        // valid video resolution
-    }
-
-    override fun get(quality: Int): CamcorderProfileProxy? {
-        if (!hasValidCameraId) {
-            return null
-        }
-        return if (!CamcorderProfile.hasProfile(cameraId, quality)) {
-            null
-        } else getProfileInternal(quality)
-        // TODO: b241296464 CamcorderProfileResolutionQuirk and
-        // CamcorderProfileResolutionValidator. If has quick, check if the proxy profile has
-        // valid video resolution
-    }
-
-    @Nullable
-    @Suppress("DEPRECATION")
-    private fun getProfileInternal(quality: Int): CamcorderProfileProxy? {
-        var profile: CamcorderProfile? = null
-        try {
-            profile = CamcorderProfile.get(cameraId, quality)
-        } catch (e: RuntimeException) {
-            // CamcorderProfile.get() will throw
-            // - RuntimeException if not able to retrieve camcorder profile params.
-            // - IllegalArgumentException if quality is not valid.
-            Logger.w(TAG, "Unable to get CamcorderProfile by quality: $quality", e)
-        }
-        return if (profile != null) CamcorderProfileProxy.fromCamcorderProfile(profile) else null
-    }
-
-    companion object {
-        private const val TAG = "CamcorderProfileProviderAdapter"
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
index 9f5dbc4..50a01d6 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
@@ -108,21 +108,19 @@
 
     override fun cancelFocusAndMetering(): ListenableFuture<Void> {
         return Futures.nonCancellationPropagating(
-            FutureChain.from(
-                focusMeteringControl.cancelFocusAndMeteringAsync().asListenableFuture()
-            ).transform(
-                Function { return@Function null }, CameraXExecutors.directExecutor()
-            )
+            threads.sequentialScope.async {
+                focusMeteringControl.cancelFocusAndMeteringAsync().join()
+                // Convert to null once the task is done, ignore the results.
+                return@async null
+            }.asListenableFuture()
         )
     }
 
     override fun setZoomRatio(ratio: Float): ListenableFuture<Void> =
-        zoomControl.setZoomRatioAsync(ratio)
+        zoomControl.setZoomRatio(ratio)
 
-    override fun setLinearZoom(linearZoom: Float): ListenableFuture<Void> {
-        val ratio = zoomControl.toZoomRatio(linearZoom)
-        return setZoomRatio(ratio)
-    }
+    override fun setLinearZoom(linearZoom: Float): ListenableFuture<Void> =
+        zoomControl.setLinearZoom(linearZoom)
 
     override fun getFlashMode(): Int {
         return flashControl.flashMode
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
index 8e53e5c..1834af5 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
@@ -40,9 +40,9 @@
 import androidx.camera.core.ExposureState
 import androidx.camera.core.FocusMeteringAction
 import androidx.camera.core.ZoomState
-import androidx.camera.core.impl.CamcorderProfileProvider
 import androidx.camera.core.impl.CameraCaptureCallback
 import androidx.camera.core.impl.CameraInfoInternal
+import androidx.camera.core.impl.EncoderProfilesProvider
 import androidx.camera.core.impl.ImageFormatConstants
 import androidx.camera.core.impl.Quirks
 import androidx.camera.core.impl.Timebase
@@ -68,7 +68,7 @@
     private val cameraCallbackMap: CameraCallbackMap,
     private val focusMeteringControl: FocusMeteringControl
 ) : CameraInfoInternal {
-    private lateinit var camcorderProfileProviderAdapter: CamcorderProfileProviderAdapter
+    private lateinit var encoderProfilesProviderAdapter: EncoderProfilesProviderAdapter
     @OptIn(ExperimentalCamera2Interop::class)
     internal val camera2CameraInfo: Camera2CameraInfo by lazy {
         Camera2CameraInfo.create(cameraProperties)
@@ -127,11 +127,11 @@
 
     override fun getImplementationType(): String = "CameraPipe"
 
-    override fun getCamcorderProfileProvider(): CamcorderProfileProvider {
-        if (!::camcorderProfileProviderAdapter.isInitialized) {
-            camcorderProfileProviderAdapter = CamcorderProfileProviderAdapter(cameraId)
+    override fun getEncoderProfilesProvider(): EncoderProfilesProvider {
+        if (!::encoderProfilesProviderAdapter.isInitialized) {
+            encoderProfilesProviderAdapter = EncoderProfilesProviderAdapter(cameraId)
         }
-        return camcorderProfileProviderAdapter
+        return encoderProfilesProviderAdapter
     }
 
     override fun getTimebase(): Timebase {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
index 4c03b51..9e84e9c 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
@@ -65,7 +65,7 @@
                 SupportedSurfaceCombination(
                     context,
                     checkNotNull(cameraMetadata),
-                    CamcorderProfileProviderAdapter(cameraId)
+                    EncoderProfilesProviderAdapter(cameraId)
                 )
         }
     }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
index 1e31588..491c696 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
@@ -21,10 +21,11 @@
 import androidx.annotation.RequiresApi
 import androidx.concurrent.futures.CallbackToFutureAdapter
 import com.google.common.util.concurrent.ListenableFuture
+import java.util.concurrent.CancellationException
+import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
-import java.util.concurrent.CancellationException
 
 /**
  * Convert a job into a ListenableFuture<Void>.
@@ -75,4 +76,20 @@
             tag
         }
     return CallbackToFutureAdapter.getFuture(resolver)
+}
+
+@OptIn(ExperimentalCoroutinesApi::class)
+fun <T> Deferred<T>.propagateTo(destination: CompletableDeferred<T>) {
+    invokeOnCompletion {
+        if (it != null) {
+            if (it is CancellationException) {
+                destination.cancel(it)
+            } else {
+                destination.completeExceptionally(it)
+            }
+        } else {
+            // Ignore exceptions - This should never throw in this situation.
+            destination.complete(getCompleted())
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EncoderProfilesProviderAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EncoderProfilesProviderAdapter.kt
new file mode 100644
index 0000000..73addda
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EncoderProfilesProviderAdapter.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.camera.camera2.pipe.integration.adapter
+
+import android.media.CamcorderProfile
+import android.media.EncoderProfiles
+import android.os.Build
+import androidx.annotation.DoNotInline
+import androidx.annotation.Nullable
+import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.integration.compat.quirk.DeviceQuirks
+import androidx.camera.camera2.pipe.integration.compat.quirk.InvalidVideoProfilesQuirk
+import androidx.camera.core.Logger
+import androidx.camera.core.impl.EncoderProfilesProvider
+import androidx.camera.core.impl.EncoderProfilesProxy
+import androidx.camera.core.impl.compat.EncoderProfilesProxyCompat
+
+/**
+ * Adapt the [EncoderProfilesProvider] interface to [CameraPipe].
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+class EncoderProfilesProviderAdapter(private val cameraIdString: String) : EncoderProfilesProvider {
+    private val hasValidCameraId: Boolean
+    private val cameraId: Int
+
+    init {
+        var hasValidCameraId = false
+        var intCameraId = -1
+        try {
+            intCameraId = cameraIdString.toInt()
+            hasValidCameraId = true
+        } catch (e: NumberFormatException) {
+            Logger.w(
+                TAG, "Camera id is not an integer:  $cameraIdString, unable to create" +
+                    " EncoderProfilesProviderAdapter."
+            )
+        }
+        this.hasValidCameraId = hasValidCameraId
+        cameraId = intCameraId
+
+        // TODO(b/241296464): CamcorderProfileResolutionQuirk
+    }
+
+    override fun hasProfile(quality: Int): Boolean {
+        if (!hasValidCameraId) {
+            return false
+        }
+        return CamcorderProfile.hasProfile(cameraId, quality)
+    }
+
+    override fun getAll(quality: Int): EncoderProfilesProxy? {
+        if (!hasValidCameraId) {
+            return null
+        }
+        if (!CamcorderProfile.hasProfile(cameraId, quality)) {
+             return null
+        }
+        return getProfilesInternal(quality)
+    }
+
+    @Nullable
+    private fun getProfilesInternal(quality: Int): EncoderProfilesProxy? {
+        if (Build.VERSION.SDK_INT >= 31) {
+            val profiles: EncoderProfiles = Api31Impl.getAll(cameraIdString, quality) ?: return null
+
+            val isVideoProfilesInvalid = DeviceQuirks[InvalidVideoProfilesQuirk::class.java] != null
+            if (isVideoProfilesInvalid) {
+                Logger.d(
+                    TAG, "EncoderProfiles contains invalid video profiles, use " +
+                        "CamcorderProfile to create EncoderProfilesProxy."
+                )
+            } else {
+                try {
+                    return EncoderProfilesProxyCompat.from(profiles)
+                } catch (e: NullPointerException) {
+                    Logger.w(
+                        TAG, "Failed to create EncoderProfilesProxy, EncoderProfiles might " +
+                            "contain invalid video profiles. Use CamcorderProfile instead.", e
+                    )
+                }
+            }
+        }
+
+        return createProfilesFromCamcorderProfile(quality)
+    }
+
+    @Nullable
+    @Suppress("DEPRECATION")
+    private fun createProfilesFromCamcorderProfile(quality: Int): EncoderProfilesProxy? {
+        var profile: CamcorderProfile? = null
+        try {
+            profile = CamcorderProfile.get(cameraId, quality)
+        } catch (e: RuntimeException) {
+            // CamcorderProfile.get() will throw
+            // - RuntimeException if not able to retrieve camcorder profile params.
+            // - IllegalArgumentException if quality is not valid.
+            Logger.w(TAG, "Unable to get CamcorderProfile by quality: $quality", e)
+        }
+        return if (profile != null) EncoderProfilesProxyCompat.from(profile) else null
+    }
+
+    @RequiresApi(31)
+    internal object Api31Impl {
+        @DoNotInline
+        fun getAll(cameraId: String, quality: Int): EncoderProfiles? {
+            return CamcorderProfile.getAll(cameraId, quality)
+        }
+    }
+
+    companion object {
+        private const val TAG = "EncoderProfilesProviderAdapter"
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
index 05cb202..527cc63 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
@@ -34,7 +34,7 @@
 import androidx.camera.core.AspectRatio
 import androidx.camera.core.Logger
 import androidx.camera.core.impl.AttachedSurfaceInfo
-import androidx.camera.core.impl.CamcorderProfileProxy
+import androidx.camera.core.impl.EncoderProfilesProxy
 import androidx.camera.core.impl.ImageFormatConstants
 import androidx.camera.core.impl.ImageOutputConfig
 import androidx.camera.core.impl.StreamSpec
@@ -70,7 +70,7 @@
 class SupportedSurfaceCombination(
     context: Context,
     private val cameraMetadata: CameraMetadata,
-    private val camcorderProfileProviderAdapter: CamcorderProfileProviderAdapter
+    private val encoderProfilesProviderAdapter: EncoderProfilesProviderAdapter
 ) {
     private val cameraId = cameraMetadata.camera.value
     private val hardwareLevel =
@@ -289,12 +289,12 @@
             // StreamConfigurationMap to determine the RECORD size.
             return getRecordSizeFromStreamConfigurationMap()
         }
-        var profile: CamcorderProfileProxy? = null
-        if (camcorderProfileProviderAdapter.hasProfile(cameraId)) {
-            profile = camcorderProfileProviderAdapter.get(cameraId)
+        var profiles: EncoderProfilesProxy? = null
+        if (encoderProfilesProviderAdapter.hasProfile(cameraId)) {
+            profiles = encoderProfilesProviderAdapter.getAll(cameraId)
         }
-        return if (profile != null) {
-            Size(profile.videoFrameWidth, profile.videoFrameHeight)
+        return if (profiles != null && profiles.videoProfiles.isNotEmpty()) {
+            Size(profiles.videoProfiles[0].width, profiles.videoProfiles[0].height)
         } else getRecordSizeByHasProfile()
     }
 
@@ -337,25 +337,25 @@
      */
     private fun getRecordSizeByHasProfile(): Size {
         var recordSize: Size = RESOLUTION_480P
-        var profile: CamcorderProfileProxy? = null
+        var profiles: EncoderProfilesProxy? = null
 
         // Check whether 4KDCI, 2160P, 2K, 1080P, 720P, 480P (sorted by size) are supported by
-        // CamcorderProfile
-        if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_4KDCI)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_4KDCI)
-        } else if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_2160P)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_2160P)
-        } else if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_2K)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_2K)
-        } else if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_1080P)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_1080P)
-        } else if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_720P)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_720P)
-        } else if (camcorderProfileProviderAdapter.hasProfile(CamcorderProfile.QUALITY_480P)) {
-            profile = camcorderProfileProviderAdapter.get(CamcorderProfile.QUALITY_480P)
+        // EncoderProfiles
+        if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_4KDCI)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_4KDCI)
+        } else if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_2160P)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_2160P)
+        } else if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_2K)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_2K)
+        } else if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_1080P)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_1080P)
+        } else if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_720P)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_720P)
+        } else if (encoderProfilesProviderAdapter.hasProfile(CamcorderProfile.QUALITY_480P)) {
+            profiles = encoderProfilesProviderAdapter.getAll(CamcorderProfile.QUALITY_480P)
         }
-        if (profile != null) {
-            recordSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
+        if (profiles != null && profiles.videoProfiles.isNotEmpty()) {
+            recordSize = Size(profiles.videoProfiles[0].width, profiles.videoProfiles[0].height)
         }
         return recordSize
     }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
index 5cc5969..8d19d82 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
@@ -17,6 +17,8 @@
 package androidx.camera.camera2.pipe.integration.adapter
 
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getLinearZoomFromZoomRatio
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getZoomRatioFromLinearZoom
 import androidx.camera.core.ZoomState
 
 /**
@@ -26,16 +28,39 @@
 data class ZoomValue(
     private val zoomRatio: Float,
     private val minZoomRatio: Float,
-    private val maxZoomRatio: Float
+    private val maxZoomRatio: Float,
 ) : ZoomState {
+    private var linearZoom: Float? = null
+
+    /**
+     * ZoomValue should be created with either zoomRatio or linearZoom and the other value should
+     * be calculated. If both are allowed to be set from outside, it becomes confusing regarding
+     * which value to use if the values don't align with conversion values.
+     * Secondary constructor with a LinearZoom value wrapper class is used for this purpose.
+     */
+    data class LinearZoom(val value: Float)
+    constructor(
+        linearZoom: LinearZoom,
+        minZoomRatio: Float,
+        maxZoomRatio: Float,
+    ) : this(
+        getZoomRatioFromLinearZoom(
+            linearZoom = linearZoom.value,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        ),
+        minZoomRatio,
+        maxZoomRatio
+    ) {
+        this.linearZoom = linearZoom.value
+    }
+
     override fun getZoomRatio(): Float = zoomRatio
     override fun getMaxZoomRatio(): Float = maxZoomRatio
     override fun getMinZoomRatio(): Float = minZoomRatio
-    override fun getLinearZoom(): Float {
-        val range = maxZoomRatio - minZoomRatio
-        if (range > 0) {
-            return (zoomRatio - minZoomRatio) / range
-        }
-        return 1.0f
-    }
-}
\ No newline at end of file
+    override fun getLinearZoom() = linearZoom ?: getLinearZoomFromZoomRatio(
+        zoomRatio = zoomRatio,
+        minZoomRatio = minZoomRatio,
+        maxZoomRatio = maxZoomRatio
+    )
+}
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
index b00002b..33adefc 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
@@ -24,6 +24,7 @@
 import androidx.camera.camera2.pipe.FrameNumber
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.RequestMetadata
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
 import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.camera2.pipe.integration.impl.Camera2ImplConfig
 import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera
@@ -51,7 +52,7 @@
     fun clearRequestOption()
     fun cancelCurrentTask()
 
-    fun applyAsync(camera: UseCaseCamera?): Deferred<Void?>
+    fun applyAsync(camera: UseCaseCamera?, cancelPreviousTask: Boolean = true): Deferred<Void?>
 
     @Module
     abstract class Bindings {
@@ -114,15 +115,23 @@
         }
     }
 
-    override fun applyAsync(camera: UseCaseCamera?): Deferred<Void?> {
+    override fun applyAsync(camera: UseCaseCamera?, cancelPreviousTask: Boolean): Deferred<Void?> {
         val signal: CompletableDeferred<Void?> = CompletableDeferred()
         val config = synchronized(lock) {
             configBuilder.build()
         }
         threads.sequentialScope.launch {
             if (camera != null) {
-                // Cancel the previous request signal if exist.
-                updateSignal?.cancelSignal()
+                if (cancelPreviousTask) {
+                    // Cancel the previous request signal if exist.
+                    updateSignal?.cancelSignal()
+                } else {
+                    // propagate the result to the previous updateSignal
+                    updateSignal?.let { previousUpdateSignal ->
+                        signal.propagateTo(previousUpdateSignal)
+                    }
+                }
+
                 updateSignal = signal
                 camera.requestControl.setConfigAsync(
                     type = UseCaseCameraRequestControl.Type.CAMERA2_CAMERA_CONTROL,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
index 7324125..3dafac7 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
@@ -29,6 +29,7 @@
 import androidx.camera.camera2.pipe.FrameNumber
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.RequestMetadata
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
 import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.camera2.pipe.integration.impl.CameraProperties
 import androidx.camera.camera2.pipe.integration.impl.ComboRequestListener
@@ -37,21 +38,22 @@
 import androidx.camera.core.CameraControl
 import dagger.Binds
 import dagger.Module
+import javax.inject.Inject
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.launch
-import javax.inject.Inject
 
 interface EvCompCompat {
     val supported: Boolean
     val range: Range<Int>
     val step: Rational
 
-    fun stopRunningTask()
+    fun stopRunningTask(throwable: Throwable)
 
     fun applyAsync(
         evCompIndex: Int,
-        camera: UseCaseCamera
+        camera: UseCaseCamera,
+        cancelPreviousTask: Boolean,
     ): Deferred<Int>
 
     @Module
@@ -90,18 +92,38 @@
     private var updateSignal: CompletableDeferred<Int>? = null
     private var updateListener: Request.Listener? = null
 
-    override fun stopRunningTask() {
+    override fun stopRunningTask(throwable: Throwable) {
         threads.sequentialScope.launch {
-            stopRunningTaskInternal()
+            updateSignal?.completeExceptionally(throwable)
         }
     }
 
-    override fun applyAsync(evCompIndex: Int, camera: UseCaseCamera): Deferred<Int> {
+    override fun applyAsync(
+        evCompIndex: Int,
+        camera: UseCaseCamera,
+        cancelPreviousTask: Boolean,
+    ): Deferred<Int> {
         val signal = CompletableDeferred<Int>()
 
         threads.sequentialScope.launch {
-            stopRunningTaskInternal()
+            updateSignal?.let { previousUpdateSignal ->
+                if (cancelPreviousTask) {
+                    // Cancel the previous request signal if exist.
+                    previousUpdateSignal.completeExceptionally(
+                        CameraControl.OperationCanceledException(
+                            "Cancelled by another setExposureCompensationIndex()"
+                        )
+                    )
+                } else {
+                    // Propagate the result to the previous updateSignal
+                    signal.propagateTo(previousUpdateSignal)
+                }
+            }
             updateSignal = signal
+            updateListener?.let {
+                comboRequestListener.removeListener(it)
+                updateListener = null
+            }
 
             camera.setParameterAsync(CONTROL_AE_EXPOSURE_COMPENSATION, evCompIndex)
 
@@ -110,7 +132,7 @@
                 override fun onComplete(
                     requestMetadata: RequestMetadata,
                     frameNumber: FrameNumber,
-                    result: FrameInfo
+                    result: FrameInfo,
                 ) {
                     val state = result.metadata[CaptureResult.CONTROL_AE_STATE]
                     val evResult = result.metadata[CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION]
@@ -121,7 +143,6 @@
                             CaptureResult.CONTROL_AE_STATE_LOCKED ->
                                 if (evResult == evCompIndex) {
                                     signal.complete(evCompIndex)
-                                    comboRequestListener.removeListener(this)
                                 }
                             else -> {
                             }
@@ -130,32 +151,14 @@
                         // If AE state is null, only wait for the exposure result to the desired
                         // value.
                         signal.complete(evCompIndex)
-
-                        // Remove the capture result listener. The updateSignal and
-                        // updateListener will be cleared before the next set exposure task.
-                        comboRequestListener.removeListener(this)
                     }
                 }
+            }.also { requestListener ->
+                comboRequestListener.addListener(requestListener, threads.sequentialExecutor)
+                signal.invokeOnCompletion { comboRequestListener.removeListener(requestListener) }
             }
-            comboRequestListener.addListener(updateListener!!, threads.sequentialExecutor)
         }
 
         return signal
     }
-
-    private fun stopRunningTaskInternal() {
-        updateSignal?.let {
-            it.completeExceptionally(
-                CameraControl.OperationCanceledException(
-                    "Cancelled by another setExposureCompensationIndex()"
-                )
-            )
-            updateSignal = null
-        }
-
-        updateListener?.let {
-            comboRequestListener.removeListener(it)
-            updateListener = null
-        }
-    }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
index 38d92ef..a9e1348 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
@@ -30,14 +30,21 @@
 import dagger.Provides
 
 interface ZoomCompat {
-    val minZoom: Float
-    val maxZoom: Float
+    val minZoomRatio: Float
+    val maxZoomRatio: Float
 
     fun apply(
         zoomRatio: Float,
         camera: UseCaseCamera
     )
 
+    /**
+     * Returns the current crop sensor region which should be used for converting
+     * [androidx.camera.core.MeteringPoint] to sensor coordinates. Returns the sensor
+     * rect if there is no crop region being set.
+     */
+    fun getCropSensorRegion(): Rect
+
     @Module
     abstract class Bindings {
         companion object {
@@ -47,7 +54,7 @@
                     val range =
                         cameraProperties.metadata[CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE]
                     if (range != null) {
-                        AndroidRZoomCompat(range)
+                        AndroidRZoomCompat(cameraProperties, range)
                     } else {
                         CropRegionZoomCompat(cameraProperties)
                     }
@@ -60,23 +67,28 @@
 }
 
 class CropRegionZoomCompat(private val cameraProperties: CameraProperties) : ZoomCompat {
-    override val minZoom: Float
+    override val minZoomRatio: Float
         get() = 1.0f
-    override val maxZoom: Float
+    override val maxZoomRatio: Float
         get() = cameraProperties.metadata.getOrDefault(
-            CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, minZoom
+            CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, minZoomRatio
         )
 
+    private var currentCropRect: Rect? = null
+
     override fun apply(
         zoomRatio: Float,
         camera: UseCaseCamera
     ) {
         val sensorRect =
             cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
-        val cropRect = computeCropRect(sensorRect, zoomRatio)
-        camera.setParameterAsync(CaptureRequest.SCALER_CROP_REGION, cropRect)
+        currentCropRect = computeCropRect(sensorRect, zoomRatio)
+        camera.setParameterAsync(CaptureRequest.SCALER_CROP_REGION, currentCropRect)
     }
 
+    override fun getCropSensorRegion() = currentCropRect
+        ?: cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
+
     private fun computeCropRect(sensorRect: Rect, zoomRatio: Float): Rect {
         val cropWidth: Float = sensorRect.width() / zoomRatio
         val cropHeight: Float = sensorRect.height() / zoomRatio
@@ -92,17 +104,23 @@
 }
 
 @RequiresApi(Build.VERSION_CODES.R)
-class AndroidRZoomCompat(private val range: Range<Float>) : ZoomCompat {
-    override val minZoom: Float
+class AndroidRZoomCompat(
+    private val cameraProperties: CameraProperties,
+    private val range: Range<Float>,
+) : ZoomCompat {
+    override val minZoomRatio: Float
         get() = range.lower
-    override val maxZoom: Float
+    override val maxZoomRatio: Float
         get() = range.upper
 
     override fun apply(
         zoomRatio: Float,
         camera: UseCaseCamera
     ) {
-        require(zoomRatio in minZoom..maxZoom)
+        require(zoomRatio in minZoomRatio..maxZoomRatio)
         camera.setParameterAsync(CaptureRequest.CONTROL_ZOOM_RATIO, zoomRatio)
     }
-}
\ No newline at end of file
+
+    override fun getCropSensorRegion(): Rect =
+        cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
+}
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirks.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirks.kt
new file mode 100644
index 0000000..a46eb22
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirks.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.integration.compat.quirk
+
+import androidx.annotation.RequiresApi
+import androidx.camera.core.impl.Quirk
+import androidx.camera.core.impl.Quirks
+
+/**
+ * Provider of device specific quirks, which are used for device specific workarounds.
+ *
+ * Device specific quirks depend on device properties, including the manufacturer
+ * ([android.os.Build.MANUFACTURER]), model ([android.os.Build.MODEL]) and OS
+ * level ([android.os.Build.VERSION.SDK_INT]).
+ *
+ * Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
+ */
+object DeviceQuirks {
+
+    /** Returns all device specific quirks loaded on the current device.  */
+    val all: Quirks by lazy {
+        Quirks(DeviceQuirksLoader.loadQuirks())
+    }
+
+    /**
+     * Retrieves a specific device [Quirk] instance given its type.
+     *
+     * @param quirkClass The type of device quirk to retrieve.
+     * @return A device [Quirk] instance of the provided type, or `null` if it isn't found.
+     */
+    operator fun <T : Quirk?> get(quirkClass: Class<T>): T? {
+        return all.get(quirkClass)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt
new file mode 100644
index 0000000..43b87c6
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.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.
+ */
+
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
+package androidx.camera.camera2.pipe.integration.compat.quirk
+
+import androidx.annotation.RequiresApi
+import androidx.camera.core.impl.Quirk
+
+/**
+ * Loads all device specific quirks required for the current device.
+ */
+object DeviceQuirksLoader {
+
+    /**
+     * Goes through all defined device-specific quirks, and returns those that should be loaded
+     * on the current device.
+     */
+    fun loadQuirks(): List<Quirk> {
+        val quirks: MutableList<Quirk> = mutableListOf()
+
+        // Load all device specific quirks.
+        if (InvalidVideoProfilesQuirk.load()) {
+            quirks.add(InvalidVideoProfilesQuirk())
+        }
+
+        return quirks
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/InvalidVideoProfilesQuirk.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/InvalidVideoProfilesQuirk.kt
new file mode 100644
index 0000000..20abaa1
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/InvalidVideoProfilesQuirk.kt
@@ -0,0 +1,79 @@
+/*
+ * 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.integration.compat.quirk
+
+import android.annotation.SuppressLint
+import android.media.EncoderProfiles
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.camera.core.impl.Quirk
+
+/**
+ * Quirk denoting the video profile list returns by [EncoderProfiles] is invalid.
+ *
+ * QuirkSummary
+ * - Bug Id: 267727595
+ * - Description: When using [EncoderProfiles] on TP1A or TD1A builds of Android API 33,
+ *   [EncoderProfiles.getVideoProfiles] returns a list with size one, but the single value in the
+ *   list is null. This is not the expected behavior, and makes [EncoderProfiles] lack of video
+ *   information.
+ * - Device(s): Pixel 4 and above pixel devices with TP1A or TD1A builds (API 33).
+ *
+ * TODO: enable CameraXQuirksClassDetector lint check when kotlin is supported.
+ */
+@SuppressLint("CameraXQuirksClassDetector")
+class InvalidVideoProfilesQuirk : Quirk {
+
+    companion object {
+        private val AFFECTED_MODELS: List<String> = listOf(
+            "pixel 4",
+            "pixel 4a",
+            "pixel 4 xl",
+            "pixel 5",
+            "pixel 5a",
+            "pixel 6",
+            "pixel 6a",
+            "pixel 6 pro",
+            "pixel 7",
+            "pixel 7 pro"
+        )
+
+        fun load(): Boolean {
+            return isAffectedModel() && isAffectedBuild()
+        }
+
+        private fun isAffectedModel(): Boolean {
+            return AFFECTED_MODELS.contains(
+                Build.MODEL.lowercase()
+            )
+        }
+
+        private fun isAffectedBuild(): Boolean {
+            return isTp1aBuild() || isTd1aBuild()
+        }
+
+        private fun isTp1aBuild(): Boolean {
+            return Build.ID.startsWith("TP1A")
+        }
+
+        private fun isTd1aBuild(): Boolean {
+            return Build.ID.startsWith("TD1A")
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/package-info.java b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/package-info.java
new file mode 100644
index 0000000..eca73c3
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.camera2.pipe.integration.compat.quirk;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
index 66e6799..2f41d39 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
@@ -25,7 +25,6 @@
 import androidx.camera.camera2.pipe.integration.impl.CameraInteropStateCallbackRepository
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.CameraThreadConfig
-import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import dagger.Component
 import dagger.Module
 import dagger.Provides
@@ -41,26 +40,16 @@
         @Provides
         fun provideCameraPipe(
             context: Context,
-            cameraThreadConfig: CameraThreadConfig,
-            cameraInteropStateCallbackRepository: CameraInteropStateCallbackRepository,
-        ): CameraPipe {
-            val executor = cameraThreadConfig.cameraExecutor
-            val sequentialExecutor = CameraXExecutors.newSequentialExecutor(executor)
-            return CameraPipe(
-                CameraPipe.Config(
-                    appContext = context.applicationContext,
-                    cameraInteropConfig = CameraPipe.CameraInteropConfig(
-                        cameraInteropStateCallbackRepository.deviceStateCallback,
-                        cameraInteropStateCallbackRepository.sessionStateCallback
-                    ),
-                    threadConfig = CameraPipe.ThreadConfig(
-                        defaultLightweightExecutor = sequentialExecutor,
-                        defaultBackgroundExecutor = executor,
-                        defaultCameraExecutor = sequentialExecutor,
-                    )
+            cameraInteropStateCallbackRepository: CameraInteropStateCallbackRepository
+        ): CameraPipe = CameraPipe(
+            CameraPipe.Config(
+                appContext = context.applicationContext,
+                cameraInteropConfig = CameraPipe.CameraInteropConfig(
+                    cameraInteropStateCallbackRepository.deviceStateCallback,
+                    cameraInteropStateCallbackRepository.sessionStateCallback
                 )
             )
-        }
+        )
 
         @Provides
         fun provideCameraDevices(cameraPipe: CameraPipe): CameraDevices {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
index a4be0a8..2bba010 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
@@ -63,16 +63,15 @@
         get() = _useCaseCamera
         set(value) {
             _useCaseCamera = value
-            updateAsync(evCompIndex)
+            updateAsync(evCompIndex, cancelPreviousTask = false)
         }
 
     override fun reset() {
-        evCompIndex = 0
-        compat.stopRunningTask()
-        updateAsync(0)
+        evCompIndex = DEFAULT_EXPOSURE_COMPENSATION
+        updateAsync(DEFAULT_EXPOSURE_COMPENSATION)
     }
 
-    fun updateAsync(exposureIndex: Int): Deferred<Int> {
+    fun updateAsync(exposureIndex: Int, cancelPreviousTask: Boolean = true): Deferred<Int> {
         if (!compat.supported) {
             return createFailureResult(
                 IllegalArgumentException("ExposureCompensation is not supported")
@@ -88,12 +87,15 @@
             )
         }
 
-        useCaseCamera?.let {
+        return useCaseCamera?.let { camera ->
             evCompIndex = exposureIndex
-            return compat.applyAsync(exposureIndex, it)
-        } ?: return createFailureResult(
-            CameraControl.OperationCanceledException("Camera is not active.")
-        )
+            compat.applyAsync(exposureIndex, camera, cancelPreviousTask)
+        } ?: run {
+            CameraControl.OperationCanceledException("Camera is not active.").let { cancelResult ->
+                compat.stopRunningTask(cancelResult)
+                createFailureResult(cancelResult)
+            }
+        }
     }
 
     private fun createFailureResult(exception: Exception) = CompletableDeferred<Int>().apply {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FlashControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FlashControl.kt
index 21fe187..e053c73 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FlashControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FlashControl.kt
@@ -17,6 +17,7 @@
 package androidx.camera.camera2.pipe.integration.impl
 
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
 import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.core.CameraControl
 import androidx.camera.core.ImageCapture
@@ -45,7 +46,7 @@
         get() = _useCaseCamera
         set(value) {
             _useCaseCamera = value
-            setFlashAsync(_flashMode)
+            setFlashAsync(_flashMode, false)
         }
 
     override fun reset() {
@@ -71,7 +72,7 @@
         }
         private set
 
-    fun setFlashAsync(flashMode: Int): Deferred<Unit> {
+    fun setFlashAsync(flashMode: Int, cancelPreviousTask: Boolean = true): Deferred<Unit> {
         val signal = CompletableDeferred<Unit>()
 
         useCaseCamera?.let {
@@ -81,13 +82,18 @@
             _flashMode = flashMode
 
             threads.sequentialScope.launch {
-                stopRunningTask()
+                if (cancelPreviousTask) {
+                    stopRunningTask()
+                } else {
+                    // Propagate the result to the previous updateSignal
+                    _updateSignal?.let { previousUpdateSignal ->
+                        signal.propagateTo(previousUpdateSignal)
+                    }
+                }
 
                 _updateSignal = signal
                 state3AControl.flashMode = flashMode
-                state3AControl.updateSignal?.join()
-
-                signal.complete(Unit)
+                state3AControl.updateSignal?.propagateTo(signal) ?: run { signal.complete(Unit) }
             }
         } ?: run {
             signal.completeExceptionally(
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 0b11ba7..90049dd 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
@@ -27,6 +27,8 @@
 import androidx.camera.camera2.pipe.AeMode
 import androidx.camera.camera2.pipe.Result3A
 import androidx.camera.camera2.pipe.integration.adapter.asListenableFuture
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
+import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
 import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.core.CameraControl.OperationCanceledException
 import androidx.camera.core.FocusMeteringAction
@@ -53,6 +55,7 @@
     private val cameraProperties: CameraProperties,
     private val state3AControl: State3AControl,
     private val threads: UseCaseThreads,
+    private val zoomCompat: ZoomCompat,
 ) : UseCaseCameraControl, UseCaseCamera.RunningUseCasesChangeListener {
     private var _useCaseCamera: UseCaseCamera? = null
 
@@ -80,15 +83,12 @@
         cancelFocusAndMeteringAsync()
     }
 
-    @Volatile
     private var previewAspectRatio: Rational? = null
-    private val sensorRect by lazy {
-        // TODO("b/262225455"): use the actual crop sensor region like in camera-camera2
-        cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
-    }
+    private val cropSensorRegion
+        get() = zoomCompat.getCropSensorRegion()
 
     private val defaultAspectRatio: Rational
-        get() = previewAspectRatio ?: Rational(sensorRect.width(), sensorRect.height())
+        get() = previewAspectRatio ?: Rational(cropSensorRegion.width(), cropSensorRegion.height())
 
     private val maxAfRegionCount =
         cameraProperties.metadata.getOrDefault(CameraCharacteristics.CONTROL_MAX_REGIONS_AF, 0)
@@ -114,19 +114,19 @@
                 val aeRectangles = meteringRegionsFromMeteringPoints(
                     action.meteringPointsAe,
                     maxAeRegionCount,
-                    sensorRect,
+                    cropSensorRegion,
                     defaultAspectRatio
                 )
                 val afRectangles = meteringRegionsFromMeteringPoints(
                     action.meteringPointsAf,
                     maxAfRegionCount,
-                    sensorRect,
+                    cropSensorRegion,
                     defaultAspectRatio
                 )
                 val awbRectangles = meteringRegionsFromMeteringPoints(
                     action.meteringPointsAwb,
                     maxAwbRegionCount,
-                    sensorRect,
+                    cropSensorRegion,
                     defaultAspectRatio
                 )
                 if (aeRectangles.isEmpty() && afRectangles.isEmpty() && awbRectangles.isEmpty()) {
@@ -161,7 +161,7 @@
                     } else {
                         if (isCancelEnabled) {
                             if (signal.isActive) {
-                                cancelFocusAndMeteringNow(useCaseCamera, signal)
+                                cancelFocusAndMeteringNowAsync(useCaseCamera, signal)
                             }
                         } else {
                             signal.complete(FocusMeteringResult.create(false))
@@ -190,19 +190,19 @@
         val rectanglesAe = meteringRegionsFromMeteringPoints(
             action.meteringPointsAe,
             maxAeRegionCount,
-            sensorRect,
+            cropSensorRegion,
             defaultAspectRatio
         )
         val rectanglesAf = meteringRegionsFromMeteringPoints(
             action.meteringPointsAf,
             maxAfRegionCount,
-            sensorRect,
+            cropSensorRegion,
             defaultAspectRatio
         )
         val rectanglesAwb = meteringRegionsFromMeteringPoints(
             action.meteringPointsAwb,
             maxAwbRegionCount,
-            sensorRect,
+            cropSensorRegion,
             defaultAspectRatio
         )
         return rectanglesAe.isNotEmpty() || rectanglesAf.isNotEmpty() || rectanglesAwb.isNotEmpty()
@@ -231,7 +231,7 @@
             threads.sequentialScope.launch {
                 cancelSignal?.setCancelException("Cancelled by another cancelFocusAndMetering()")
                 cancelSignal = signal
-                signal.complete(cancelFocusAndMeteringNow(useCaseCamera, updateSignal))
+                cancelFocusAndMeteringNowAsync(useCaseCamera, updateSignal).propagateTo(signal)
             }
         } ?: run {
             signal.completeExceptionally(OperationCanceledException("Camera is not active."))
@@ -240,13 +240,13 @@
         return signal
     }
 
-    private suspend fun cancelFocusAndMeteringNow(
+    private suspend fun cancelFocusAndMeteringNowAsync(
         useCaseCamera: UseCaseCamera,
         signalToCancel: CompletableDeferred<FocusMeteringResult>?,
-    ): Result3A {
+    ): Deferred<Result3A> {
         signalToCancel?.setCancelException("Cancelled by cancelFocusAndMetering()")
         state3AControl.preferredFocusMode = null
-        return useCaseCamera.requestControl.cancelFocusAndMeteringAsync().await()
+        return useCaseCamera.requestControl.cancelFocusAndMeteringAsync()
     }
 
     private fun <T> CompletableDeferred<T>.setCancelException(message: String) {
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 dc8aa7e..4c5f71f 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
@@ -19,9 +19,12 @@
 import android.hardware.camera2.CameraCharacteristics
 import android.hardware.camera2.CameraDevice
 import android.hardware.camera2.CaptureRequest
+import androidx.annotation.GuardedBy
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.integration.adapter.SessionConfigAdapter
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
 import androidx.camera.camera2.pipe.integration.config.CameraScope
+import androidx.camera.core.CameraControl
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.CaptureConfig
@@ -45,7 +48,16 @@
         set(value) {
             _useCaseCamera = value
             value?.let {
+                val previousSignals = synchronized(lock) {
+                    updateSignal = null
+                    updateSignals.toList()
+                }
+
                 invalidate() // Always apply the settings to the camera.
+
+                synchronized(lock) { updateSignal }?.let { newUpdateSignal ->
+                    previousSignals.forEach { newUpdateSignal.propagateTo(it) }
+                } ?: run { previousSignals.forEach { it.complete(Unit) } }
             }
         }
 
@@ -68,6 +80,12 @@
         intArrayOf(CaptureRequest.CONTROL_AWB_MODE_OFF)
     ).asList()
 
+    private val lock = Any()
+
+    @GuardedBy("lock")
+    private val updateSignals = mutableSetOf<CompletableDeferred<Unit>>()
+
+    @GuardedBy("lock")
     var updateSignal: Deferred<Unit>? = null
         private set
     var flashMode by updateOnPropertyChange(DEFAULT_FLASH_MODE)
@@ -76,6 +94,7 @@
     var preferredFocusMode: Int? by updateOnPropertyChange(null)
 
     override fun reset() {
+        synchronized(lock) { updateSignals.toList() }.cancelAll()
         preferredAeMode = null
         preferredFocusMode = null
         flashMode = DEFAULT_FLASH_MODE
@@ -106,7 +125,7 @@
 
         val preferAfMode = preferredFocusMode ?: getDefaultAfMode()
 
-        updateSignal = useCaseCamera?.requestControl?.addParametersAsync(
+        useCaseCamera?.requestControl?.addParametersAsync(
             values = mapOf(
                 CaptureRequest.CONTROL_AE_MODE to getSupportedAeMode(preferAeMode),
                 CaptureRequest.CONTROL_AF_MODE to getSupportedAfMode(preferAfMode),
@@ -114,7 +133,21 @@
                     CaptureRequest.CONTROL_AWB_MODE_AUTO
                 ),
             )
-        ) ?: CompletableDeferred(null)
+        )?.apply {
+            toCompletableDeferred().also { signal ->
+                synchronized(lock) {
+                    updateSignals.add(signal)
+                    updateSignal = signal
+                    signal.invokeOnCompletion {
+                        synchronized(lock) {
+                            updateSignals.remove(signal)
+                        }
+                    }
+                }
+            }
+        } ?: run {
+            synchronized(lock) { updateSignal = CompletableDeferred(null) }
+        }
     }
 
     private fun getDefaultAfMode(): Int = when (template) {
@@ -189,6 +222,13 @@
         }
     }
 
+    private fun <T> Deferred<T>.toCompletableDeferred() =
+        CompletableDeferred<T>().also { propagateTo(it) }
+
+    private fun <T> Collection<CompletableDeferred<T>>.cancelAll() = forEach {
+        it.completeExceptionally(CameraControl.OperationCanceledException("Camera is not active."))
+    }
+
     @Module
     abstract class Bindings {
         @Binds
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/TorchControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/TorchControl.kt
index 7981dc9..21e752a 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/TorchControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/TorchControl.kt
@@ -19,6 +19,7 @@
 import android.hardware.camera2.CameraCharacteristics
 import android.hardware.camera2.CaptureRequest
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.integration.adapter.propagateTo
 import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.core.CameraControl
 import androidx.camera.core.TorchState
@@ -51,10 +52,11 @@
         set(value) {
             _useCaseCamera = value
             setTorchAsync(
-                when (torchStateLiveData.value) {
+                torch = when (torchStateLiveData.value) {
                     TorchState.ON -> true
                     else -> false
-                }
+                },
+                cancelPreviousTask = false,
             )
         }
 
@@ -77,7 +79,7 @@
 
     private var _updateSignal: CompletableDeferred<Unit>? = null
 
-    fun setTorchAsync(torch: Boolean): Deferred<Unit> {
+    fun setTorchAsync(torch: Boolean, cancelPreviousTask: Boolean = true): Deferred<Unit> {
         val signal = CompletableDeferred<Unit>()
 
         if (!hasFlashUnit) {
@@ -89,7 +91,15 @@
             _torchState.setLiveDataValue(torch)
 
             threads.sequentialScope.launch {
-                stopRunningTaskInternal()
+                if (cancelPreviousTask) {
+                    stopRunningTaskInternal()
+                } else {
+                    // Propagate the result to the previous updateSignal
+                    _updateSignal?.let { previousUpdateSignal ->
+                        signal.propagateTo(previousUpdateSignal)
+                    }
+                }
+
                 _updateSignal = signal
 
                 // TODO(b/209757083), handle the failed result of the setTorchAsync().
@@ -98,9 +108,7 @@
                 // Hold the internal AE mode to ON while the torch is turned ON.
                 state3AControl.preferredAeMode =
                     if (torch) CaptureRequest.CONTROL_AE_MODE_ON else null
-                state3AControl.updateSignal?.join()
-
-                signal.complete(Unit)
+                state3AControl.updateSignal?.propagateTo(signal) ?: run { signal.complete(Unit) }
             }
         } ?: run {
             signal.createFailureResult(
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
index 698da1b..66fbb27 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
@@ -21,6 +21,8 @@
 import androidx.camera.camera2.pipe.integration.adapter.asListenableFuture
 import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
 import androidx.camera.camera2.pipe.integration.config.CameraScope
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getLinearZoomFromZoomRatio
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getZoomRatioFromLinearZoom
 import androidx.camera.core.CameraControl
 import androidx.camera.core.ZoomState
 import androidx.camera.core.impl.utils.futures.Futures
@@ -31,7 +33,6 @@
 import dagger.Module
 import dagger.multibindings.IntoSet
 import javax.inject.Inject
-import kotlin.math.abs
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
@@ -47,11 +48,11 @@
 ) : UseCaseCameraControl {
     // NOTE: minZoom may be lower than 1.0
     // NOTE: Default zoom ratio is 1.0 (DEFAULT_ZOOM_RATIO)
-    val minZoom: Float = zoomCompat.minZoom
-    val maxZoom: Float = zoomCompat.maxZoom
+    val minZoomRatio: Float = zoomCompat.minZoomRatio
+    val maxZoomRatio: Float = zoomCompat.maxZoomRatio
 
     val defaultZoomState by lazy {
-        ZoomValue(DEFAULT_ZOOM_RATIO, minZoom, maxZoom)
+        ZoomValue(DEFAULT_ZOOM_RATIO, minZoomRatio, maxZoomRatio)
     }
 
     private val _zoomState by lazy {
@@ -62,28 +63,18 @@
         get() = _zoomState
 
     /** Linear zoom is between 0.0f and 1.0f */
-    fun toLinearZoom(zoomRatio: Float): Float {
-        val range = zoomCompat.maxZoom - zoomCompat.minZoom
-        if (range > 0) {
-            return (zoomRatio - zoomCompat.minZoom) / range
-        }
-        return 0.0f
-    }
+    fun toLinearZoom(zoomRatio: Float) = getLinearZoomFromZoomRatio(
+        zoomRatio = zoomRatio,
+        minZoomRatio = minZoomRatio,
+        maxZoomRatio = maxZoomRatio
+    )
 
     /** Zoom ratio is commonly used as the "1x, 2x, 5x" zoom ratio. Zoom ratio may be less than 1 */
-    fun toZoomRatio(linearZoom: Float): Float {
-        val range = zoomCompat.maxZoom - zoomCompat.minZoom
-        if (range > 0) {
-            return linearZoom * range + zoomCompat.minZoom
-        }
-
-        // if minZoom = maxZoom = 2.0f, 2.0f should be returned instead of default 1.0f
-        if (nearZero(range)) {
-            return zoomCompat.minZoom
-        }
-
-        return DEFAULT_ZOOM_RATIO
-    }
+    private fun toZoomRatio(linearZoom: Float) = getZoomRatioFromLinearZoom(
+        linearZoom = linearZoom,
+        minZoomRatio = minZoomRatio,
+        maxZoomRatio = maxZoomRatio
+    )
 
     private var _useCaseCamera: UseCaseCamera? = null
     override var useCaseCamera: UseCaseCamera?
@@ -117,16 +108,46 @@
         }
     }
 
-    fun setZoomRatioAsync(ratio: Float): ListenableFuture<Void> {
+    fun setLinearZoom(linearZoom: Float): ListenableFuture<Void> {
+        if (linearZoom > 1.0f || linearZoom < 0f) {
+            val outOfRangeDesc =
+                "Requested linearZoom $linearZoom is not within valid range [0, 1]"
+            return Futures.immediateFailedFuture(
+                IllegalArgumentException(outOfRangeDesc)
+            )
+        }
+
+        val zoomValue = ZoomValue(
+            ZoomValue.LinearZoom(linearZoom),
+            minZoomRatio,
+            maxZoomRatio,
+        )
+        return setZoomValue(zoomValue)
+    }
+
+    fun setZoomRatio(zoomRatio: Float): ListenableFuture<Void> {
+        if (zoomRatio > maxZoomRatio || zoomRatio < minZoomRatio) {
+            val outOfRangeDesc =
+                "Requested zoomRatio $zoomRatio is not within valid range" +
+                    " [$minZoomRatio, $maxZoomRatio]"
+            return Futures.immediateFailedFuture(
+                IllegalArgumentException(outOfRangeDesc)
+            )
+        }
+
+        val zoomValue = ZoomValue(
+            zoomRatio,
+            minZoomRatio,
+            maxZoomRatio,
+        )
+        return setZoomValue(zoomValue)
+    }
+
+    fun setZoomValue(zoomValue: ZoomValue): ListenableFuture<Void> {
         // TODO: report IllegalArgumentException if ratio not in range
         return Futures.nonCancellationPropagating(
             useCaseCamera?.let {
                 threads.scope.launch(start = CoroutineStart.UNDISPATCHED) {
-                    val zoomValue = ZoomValue(
-                        ratio,
-                        minZoom,
-                        maxZoom
-                    )
                     setZoomState(zoomValue)
                     update()
                 }.asListenableFuture()
@@ -136,10 +157,6 @@
         )
     }
 
-    private fun nearZero(num: Float): Boolean {
-        return abs(num) < 2.0 * Math.ulp(abs(num))
-    }
-
     @Module
     abstract class Bindings {
         @Binds
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/ZoomMath.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/ZoomMath.kt
new file mode 100644
index 0000000..0114d24
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/ZoomMath.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.camera.camera2.pipe.integration.internal
+
+import androidx.core.math.MathUtils
+import kotlin.math.abs
+
+/**
+ * This class is used for containing the mathematical calculations for ZoomControl, mainly the
+ * conversions between zoomRatio and linearZoom.
+ *
+ * The linearZoom is the percentage of zoom amount i.e. how much cropWidth is being used,
+ * so linearZoom = 0.5 should represent the middle point of
+ * [minZoomCropWidth, maxZoomCropWidth] range. But that does not mean it should be the same as
+ * (minZoom + maxZoom) / 2. For example, consider the case where
+ * original cropWidth = 10000 for zoomRatio = 1.0f,
+ * minZoomRatio = 1.0f, maxZoomRatio = 10.0f,
+ * zoomRatio = 5.5f may not represent linearZoom = 0.5 i.e. the half zoom amount. Here,
+ * zoomRatio = 1.0f, cropWidth = 10000,
+ * zoomRatio = 5.5f, cropWidth = 1818.18
+ * zoomRatio = 10.0f, cropWidth = 1000
+ * As observed, zoomRatio = 5.5f does not yield cropWidth = 5500 which would be the actual
+ * zooming amount middle point.
+ */
+object ZoomMath {
+    fun getLinearZoomFromZoomRatio(
+        zoomRatio: Float,
+        minZoomRatio: Float,
+        maxZoomRatio: Float
+    ): Float {
+        // if zoom is not supported i.e. minZoomRatio = maxZoomRatio, return 0
+        if (areFloatsEqual(minZoomRatio, maxZoomRatio)) {
+            return 0f
+        }
+
+        if (areFloatsEqual(zoomRatio, maxZoomRatio)) {
+            return 1f
+        } else if (areFloatsEqual(zoomRatio, minZoomRatio)) {
+            return 0f
+        }
+
+        /**
+         * linearZoom should represent the percentage of zoom amount based on how much cropWidth
+         * is visible.
+         *
+         * The original sensor region width is considered as 1.0f here as we only need the
+         * linearZoom ratio, not the actual crop width.
+         */
+        val relativeCropWidth = 1.0f / zoomRatio
+        val relativeCropWidthInMaxZoom = 1.0f / maxZoomRatio
+        val relativeCropWidthInMinZoom = 1.0f / minZoomRatio
+
+        val linearZoom = (relativeCropWidthInMinZoom - relativeCropWidth) /
+            (relativeCropWidthInMinZoom - relativeCropWidthInMaxZoom)
+
+        return MathUtils.clamp(linearZoom, 0f, 1.0f)
+    }
+
+    fun getZoomRatioFromLinearZoom(
+        linearZoom: Float,
+        minZoomRatio: Float,
+        maxZoomRatio: Float
+    ): Float {
+        if (areFloatsEqual(linearZoom, 1.0f)) {
+            return maxZoomRatio
+        } else if (areFloatsEqual(linearZoom, 0f)) {
+            return minZoomRatio
+        }
+
+        /**
+         * This crop width is proportional to the real crop width.
+         * The real crop with = sensorWidth/ zoomRatio,  but we need the ratio only so we can
+         * assume sensorWidth as 1.0f.
+         */
+        val relativeCropWidthInMaxZoom = 1.0f / maxZoomRatio
+        val relativeCropWidthInMinZoom = 1.0f / minZoomRatio
+
+        val cropWidth = relativeCropWidthInMinZoom -
+            (relativeCropWidthInMinZoom - relativeCropWidthInMaxZoom) * linearZoom
+
+        val ratio = 1.0f / cropWidth
+
+        return MathUtils.clamp(ratio, minZoomRatio, maxZoomRatio)
+    }
+
+    private fun areFloatsEqual(num1: Float, num2: Float): Boolean {
+        return nearZero(num1 - num2)
+    }
+
+    private fun nearZero(num: Float): Boolean {
+        return abs(num) < 2.0 * Math.ulp(abs(num))
+    }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
index 35d0833..4d669ef 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
@@ -69,7 +69,7 @@
             _useCaseCamera?.also {
                 requestListener.removeListener(compat)
                 requestListener.addListener(compat, threads.sequentialExecutor)
-                compat.applyAsync(it)
+                compat.applyAsync(it, false)
             }
         }
 
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapterTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapterTest.kt
index fe14c55..685eb31 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapterTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapterTest.kt
@@ -98,12 +98,12 @@
         // if useCaseCamera is null, zoom setting operation will be cancelled
         zoomControl.useCaseCamera = FakeUseCaseCamera()
 
-        zoomControl.setZoomRatioAsync(3.0f)[3, TimeUnit.SECONDS]
+        val expectedZoomState = ZoomValue(3.0f, 1.0f, 10.0f)
+        zoomControl.setZoomValue(expectedZoomState)[3, TimeUnit.SECONDS]
 
-        // minZoom and maxZoom will be set as 0 due to FakeZoomCompat using those values
-        assertWithMessage("zoomState did not return default zoom ratio successfully")
+        assertWithMessage("zoomState did not return the correct zoom state successfully")
             .that(currentZoomState)
-            .isEqualTo(ZoomValue(3.0f, zoomControl.minZoom, zoomControl.maxZoom))
+            .isEqualTo(expectedZoomState)
     }
 
     @Test
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapterTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapterTest.kt
new file mode 100644
index 0000000..87533ee
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapterTest.kt
@@ -0,0 +1,77 @@
+/*
+ * 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.pipe.integration.adapter
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+@DoNotInstrument
+class CoroutineAdapterTest {
+    @Test
+    fun propagateCompleteResult(): Unit = runBlocking {
+        // Arrange.
+        val resultValue = 123
+        val sourceDeferred = CompletableDeferred<Int>()
+        val resultDeferred = CompletableDeferred<Int>()
+        sourceDeferred.propagateTo(resultDeferred)
+
+        // Act.
+        sourceDeferred.complete(resultValue)
+
+        // Assert.
+        assertThat(resultDeferred.await()).isEqualTo(resultValue)
+    }
+
+    @Test
+    fun propagateCancelResult() {
+        // Arrange.
+        val sourceDeferred = CompletableDeferred<Unit>()
+        val resultDeferred = CompletableDeferred<Unit>()
+        sourceDeferred.propagateTo(resultDeferred)
+
+        // Act.
+        sourceDeferred.cancel()
+
+        // Assert.
+        assertThat(resultDeferred.isCancelled).isTrue()
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun propagateExceptionResult() {
+        // Arrange.
+        val sourceDeferred = CompletableDeferred<Unit>()
+        val resultDeferred = CompletableDeferred<Unit>()
+        sourceDeferred.propagateTo(resultDeferred)
+        val testThrowable = Throwable()
+
+        // Act.
+        sourceDeferred.completeExceptionally(testThrowable)
+
+        // Assert.
+        assertThat(resultDeferred.getCompletionExceptionOrNull()).isSameInstanceAs(testThrowable)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt
index 50c55ae..d1c277d 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
@@ -29,6 +29,7 @@
 import android.util.Size
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.Result3A
+import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
 import androidx.camera.camera2.pipe.integration.impl.CameraProperties
 import androidx.camera.camera2.pipe.integration.impl.FocusMeteringControl
 import androidx.camera.camera2.pipe.integration.impl.State3AControl
@@ -37,6 +38,7 @@
 import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
 import androidx.camera.camera2.pipe.integration.testing.FakeCameraProperties
 import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCameraRequestControl
+import androidx.camera.camera2.pipe.integration.testing.FakeZoomCompat
 import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
 import androidx.camera.camera2.pipe.testing.FakeFrameMetadata
 import androidx.camera.core.CameraControl
@@ -332,7 +334,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
@@ -410,6 +411,82 @@
     }
 
     @Test
+    fun cropRegionIsSet_resultBasedOnCropRegion() {
+        val cropWidth = 480
+        val cropHeight = 360
+        val cropRect = Rect(
+            SENSOR_WIDTH / 2 - cropWidth / 2,
+            SENSOR_HEIGHT / 2 - cropHeight / 2,
+            SENSOR_WIDTH / 2 + cropWidth / 2, SENSOR_HEIGHT / 2 + cropHeight / 2
+        )
+
+        focusMeteringControl = initFocusMeteringControl(
+            cameraId = CAMERA_ID_0,
+            zoomCompat = FakeZoomCompat(croppedSensorArea = cropRect),
+        )
+
+        val centerPt = pointFactory.createPoint(0.5f, 0.5f)
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(centerPt).build()
+        )
+
+        val areaWidth = (MeteringPointFactory.getDefaultPointSize() * cropRect.width()).toInt()
+        val areaHeight = (MeteringPointFactory.getDefaultPointSize() * cropRect.height()).toInt()
+        val adjustedRect = Rect(
+            cropRect.centerX() - areaWidth / 2,
+            cropRect.centerY() - areaHeight / 2,
+            cropRect.centerX() + areaWidth / 2,
+            cropRect.centerY() + areaHeight / 2
+        )
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region")
+                .that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
+    fun cropRegionIsSetTwice_resultAlwaysBasedOnCurrentCropRegion() {
+        val cropWidth = 480
+        val cropHeight = 360
+        val cropRect = Rect(
+            SENSOR_WIDTH / 2 - cropWidth / 2,
+            SENSOR_HEIGHT / 2 - cropHeight / 2,
+            SENSOR_WIDTH / 2 + cropWidth / 2, SENSOR_HEIGHT / 2 + cropHeight / 2
+        )
+
+        val zoomCompat = FakeZoomCompat(croppedSensorArea = Rect(0, 0, 640, 480))
+        focusMeteringControl = initFocusMeteringControl(
+            cameraId = CAMERA_ID_0,
+            zoomCompat = zoomCompat,
+        )
+
+        val centerPt = pointFactory.createPoint(0.5f, 0.5f)
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(centerPt).build()
+        )
+
+        zoomCompat.croppedSensorArea = cropRect
+        startFocusMeteringAndAwait(
+            FocusMeteringAction.Builder(centerPt).build()
+        )
+
+        val areaWidth = (MeteringPointFactory.getDefaultPointSize() * cropRect.width()).toInt()
+        val areaHeight = (MeteringPointFactory.getDefaultPointSize() * cropRect.height()).toInt()
+        val adjustedRect = Rect(
+            cropRect.centerX() - areaWidth / 2,
+            cropRect.centerY() - areaHeight / 2,
+            cropRect.centerX() + areaWidth / 2,
+            cropRect.centerY() + areaHeight / 2
+        )
+        with(fakeRequestControl.focusMeteringCalls.last()) {
+            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
+            assertWithMessage("Wrong AF region")
+                .that(afRegions[0].rect).isEqualTo(adjustedRect)
+        }
+    }
+
+    @Test
     fun previewFovAdjusted_16by9_to_4by3() {
         // use 16:9 preview aspect ratio with sensor region of 4:3 (camera 0)
         focusMeteringControl = initFocusMeteringControl(
@@ -432,8 +509,9 @@
     fun previewFovAdjusted_4by3_to_16by9() {
         // use 4:3 preview aspect ratio with sensor region of 16:9 (camera 1)
         focusMeteringControl = initFocusMeteringControl(
-            CAMERA_ID_1,
-            setOf(createPreview(Size(640, 480))),
+            cameraId = CAMERA_ID_1,
+            useCases = setOf(createPreview(Size(640, 480))),
+            zoomCompat = FakeZoomCompat(croppedSensorArea = Rect(0, 0, 1920, 1080))
         )
 
         startFocusMeteringAndAwait(
@@ -815,7 +893,6 @@
         assertThat(focusMeteringControl.isFocusMeteringSupported(action)).isTrue()
     }
 
-    @Ignore("b/266123157")
     @Test
     fun isFocusMeteringSupported_noSupport3ARegion_shouldReturnFalse() {
         val action = FocusMeteringAction.Builder(point1).build()
@@ -1033,7 +1110,6 @@
     //  - [b/255679866] triggerAfWithTemplate, triggerAePrecaptureWithTemplate,
     //          cancelAfAeTriggerWithTemplate
     //  - startFocusAndMetering_AfRegionCorrectedByQuirk
-    //  - [b/262225455] cropRegionIsSet_resultBasedOnCropRegion
 
     private fun assertFutureFocusCompleted(
         future: ListenableFuture<FocusMeteringResult>,
@@ -1128,10 +1204,12 @@
         useCases: Set<UseCase> = emptySet(),
         useCaseThreads: UseCaseThreads = fakeUseCaseThreads,
         state3AControl: State3AControl = createState3AControl(cameraId),
+        zoomCompat: ZoomCompat = FakeZoomCompat()
     ) = FocusMeteringControl(
             cameraPropertiesMap[cameraId]!!,
             state3AControl,
-            useCaseThreads
+            useCaseThreads,
+            zoomCompat
         ).apply {
             fakeUseCaseCamera.runningUseCases = useCases
             useCaseCamera = fakeUseCaseCamera
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
index 59295e2..23571ca 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
@@ -21,7 +21,10 @@
 import android.hardware.camera2.CameraCharacteristics
 import android.hardware.camera2.CameraManager
 import android.hardware.camera2.params.StreamConfigurationMap
-import android.media.CamcorderProfile
+import android.media.CamcorderProfile.QUALITY_1080P
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_480P
+import android.media.CamcorderProfile.QUALITY_720P
 import android.media.MediaRecorder
 import android.os.Build
 import android.util.Pair
@@ -50,8 +53,9 @@
 import androidx.camera.core.Preview
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.UseCase
-import androidx.camera.core.impl.CamcorderProfileProxy
 import androidx.camera.core.impl.CameraThreadConfig
+import androidx.camera.core.impl.EncoderProfilesProxy
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy
 import androidx.camera.core.impl.MutableStateObservable
 import androidx.camera.core.impl.Observable
 import androidx.camera.core.impl.StreamSpec
@@ -61,16 +65,15 @@
 import androidx.camera.core.impl.UseCaseConfigFactory
 import androidx.camera.core.impl.utils.CompareSizesByArea
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.camera.testing.CamcorderProfileUtil
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.Configs
+import androidx.camera.testing.EncoderProfilesUtil
 import androidx.camera.testing.SurfaceTextureProvider
-import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
-import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
 import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.camera.video.FallbackStrategy
 import androidx.camera.video.MediaSpec
@@ -125,20 +128,17 @@
     private val legacyVideoMaximumVideoSize = Size(1920, 1080)
     private val mod16Size = Size(960, 544)
     private val mod16SizeStreamSpec = StreamSpec.builder(mod16Size).build()
-    private val profileUhd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_2160P, recordSize.width, recordSize
-            .height
+    private val profileUhd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        recordSize.width, recordSize.height
     )
-    private val profileFhd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_1080P, 1920, 1080
+    private val profileFhd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        1920, 1080
     )
-    private val profileHd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_720P, previewSize.width, previewSize
-            .height
+    private val profileHd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        previewSize.width, previewSize.height
     )
-    private val profileSd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_480P, vgaSize.width,
-        vgaSize.height
+    private val profileSd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        vgaSize.width, vgaSize.height
     )
     private val supportedSizes = arrayOf(
         Size(4032, 3024), // 4:3
@@ -161,8 +161,9 @@
     private lateinit var fakeCameraMetadata: FakeCameraMetadata
 
     private val mockCameraAppComponent: CameraAppComponent = mock()
-    private val mockCamcorderProfileAdapter: CamcorderProfileProviderAdapter = mock()
-    private val mockCamcorderProxy: CamcorderProfileProxy = mock()
+    private val mockEncoderProfilesAdapter: EncoderProfilesProviderAdapter = mock()
+    private val mockEncoderProfilesProxy: EncoderProfilesProxy = mock()
+    private val mockVideoProfileProxy: VideoProfileProxy = mock()
 
     @Before
     fun setUp() {
@@ -172,12 +173,12 @@
             displaySize
                 .height
         )
-        whenever(mockCamcorderProfileAdapter.hasProfile(ArgumentMatchers.anyInt()))
-            .thenReturn(true)
-        whenever(mockCamcorderProxy.videoFrameWidth).thenReturn(3840)
-        whenever(mockCamcorderProxy.videoFrameHeight).thenReturn(2160)
-        whenever(mockCamcorderProfileAdapter[ArgumentMatchers.anyInt()])
-            .thenReturn(mockCamcorderProxy)
+        whenever(mockEncoderProfilesAdapter.hasProfile(ArgumentMatchers.anyInt())).thenReturn(true)
+        whenever(mockVideoProfileProxy.width).thenReturn(3840)
+        whenever(mockVideoProfileProxy.height).thenReturn(2160)
+        whenever(mockEncoderProfilesProxy.videoProfiles).thenReturn(listOf(mockVideoProfileProxy))
+        whenever(mockEncoderProfilesAdapter.getAll(ArgumentMatchers.anyInt()))
+            .thenReturn(mockEncoderProfilesProxy)
     }
 
     @After
@@ -190,7 +191,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLegacySupportedCombinationList()
         for (combination in combinationList) {
@@ -205,7 +206,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLegacySupportedCombinationList()
         val isSupported = isAllSubConfigListSupported(supportedSurfaceCombination, combinationList)
@@ -217,7 +218,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLimitedSupportedCombinationList()
         for (combination in combinationList) {
@@ -232,7 +233,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getFullSupportedCombinationList()
         for (combination in combinationList) {
@@ -247,7 +248,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLevel3SupportedCombinationList()
         for (combination in combinationList) {
@@ -262,7 +263,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLimitedSupportedCombinationList()
         for (combination in combinationList) {
@@ -277,7 +278,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLimitedSupportedCombinationList()
         val isSupported = isAllSubConfigListSupported(supportedSurfaceCombination, combinationList)
@@ -289,7 +290,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getFullSupportedCombinationList()
         for (combination in combinationList) {
@@ -304,7 +305,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLevel3SupportedCombinationList()
         for (combination in combinationList) {
@@ -319,7 +320,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getFullSupportedCombinationList()
         for (combination in combinationList) {
@@ -334,7 +335,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getFullSupportedCombinationList()
         val isSupported = isAllSubConfigListSupported(supportedSurfaceCombination, combinationList)
@@ -346,7 +347,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLevel3SupportedCombinationList()
         for (combination in combinationList) {
@@ -365,7 +366,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLimitedSupportedCombinationList()
         for (combination in combinationList) {
@@ -384,7 +385,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLegacySupportedCombinationList()
         for (combination in combinationList) {
@@ -403,7 +404,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getFullSupportedCombinationList()
         for (combination in combinationList) {
@@ -422,7 +423,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getRAWSupportedCombinationList()
         for (combination in combinationList) {
@@ -437,7 +438,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLevel3SupportedCombinationList()
         for (combination in combinationList) {
@@ -452,7 +453,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val combinationList = getLevel3SupportedCombinationList()
         val isSupported = isAllSubConfigListSupported(supportedSurfaceCombination, combinationList)
@@ -464,7 +465,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val fakeUseCase = FakeUseCaseConfig.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -499,7 +500,7 @@
             .build()
         preview.setSurfaceProvider(
             CameraXExecutors.directExecutor(),
-            SurfaceTextureProvider.createSurfaceTextureProvider(mock<SurfaceTextureCallback>())
+            SurfaceTextureProvider.createSurfaceTextureProvider(mock())
         )
         val imageCapture = ImageCapture.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -540,12 +541,12 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val preview = Preview.Builder().build()
         preview.setSurfaceProvider(
             CameraXExecutors.directExecutor(),
-            SurfaceTextureProvider.createSurfaceTextureProvider(mock<SurfaceTextureCallback>())
+            SurfaceTextureProvider.createSurfaceTextureProvider(mock())
         )
         val imageCapture = ImageCapture.Builder().build()
         val imageAnalysis = ImageAnalysis.Builder().build()
@@ -610,7 +611,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         /* This test case is for b/139018208 that get small resolution 144x256 with below
@@ -658,7 +659,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Sets each of mSupportedSizes as target resolution and also sets target rotation as
@@ -685,7 +686,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Sets target resolution as 1280x640, all supported resolutions will be put into aspect
@@ -709,7 +710,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val imageCapture = ImageCapture.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -740,7 +741,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Legacy camera only support (PRIV, PREVIEW) + (PRIV, PREVIEW)
@@ -774,7 +775,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val imageCapture = ImageCapture.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -818,7 +819,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val imageCapture = ImageCapture.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -869,7 +870,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val imageCapture = ImageCapture.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_4_3) // mMaximumSize(4032x3024) is 4:3
@@ -919,7 +920,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         /* This test case is for b/132603284 that divide by zero issue crash happened in below
@@ -1007,7 +1008,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val formatResolutionsPairList: MutableList<Pair<Int, Array<Size>>> = ArrayList()
         formatResolutionsPairList.add(Pair.create(ImageFormat.JPEG, arrayOf(vgaSize)))
@@ -1059,7 +1060,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.YUV_420_888, vgaSize
@@ -1074,7 +1075,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.YUV_420_888, previewSize
@@ -1089,7 +1090,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.YUV_420_888, recordSize
@@ -1104,7 +1105,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.YUV_420_888, maximumSize
@@ -1119,7 +1120,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.JPEG, vgaSize
@@ -1134,7 +1135,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.JPEG, previewSize
@@ -1149,7 +1150,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.JPEG, recordSize
@@ -1164,7 +1165,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val surfaceConfig = supportedSurfaceCombination.transformSurfaceConfig(
             ImageFormat.JPEG, maximumSize
@@ -1179,7 +1180,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val maximumYUVSize =
             supportedSurfaceCombination.getMaxOutputSizeByFormat(ImageFormat.YUV_420_888)
@@ -1194,7 +1195,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val preview = Preview.Builder()
             .setTargetAspectRatio(AspectRatio.RATIO_16_9)
@@ -1256,7 +1257,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().build()
 
@@ -1285,7 +1286,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3)
             .build()
@@ -1319,7 +1320,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(
             AspectRatio.RATIO_16_9
@@ -1354,7 +1355,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(1080, 1920)
@@ -1391,7 +1392,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetRotation(
             Surface.ROTATION_90
@@ -1427,7 +1428,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetRotation(
             Surface.ROTATION_90
@@ -1458,7 +1459,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetRotation(
             Surface.ROTATION_90
@@ -1491,7 +1492,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(1280, 600)
@@ -1521,7 +1522,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(Size(1280, 720)).build()
 
@@ -1545,7 +1546,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val customOrderedResolutions = listOf(
             Size(640, 480),
@@ -1583,7 +1584,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setDefaultResolution(
             Size(
@@ -1613,7 +1614,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setDefaultResolution(
             Size(1280, 720)
@@ -1657,7 +1658,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(1920, 1080)
@@ -1685,7 +1686,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(320, 240)
@@ -1718,7 +1719,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(320, 180)
@@ -1753,7 +1754,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(320, 240)
@@ -1782,7 +1783,7 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(1920, 1080)
@@ -1826,7 +1827,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(320, 200)
@@ -1861,7 +1862,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(192, 144)
@@ -1893,7 +1894,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setMaxResolution(
             Size(192, 144)
@@ -1919,7 +1920,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(185, 90)
@@ -1959,7 +1960,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetResolution(
             Size(1080, 2016)
@@ -2000,7 +2001,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(
             AspectRatio.RATIO_16_9
@@ -2050,7 +2051,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(
             AspectRatio.RATIO_16_9
@@ -2087,7 +2088,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(
             AspectRatio.RATIO_16_9
@@ -2135,7 +2136,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val useCase = FakeUseCaseConfig.Builder().setTargetAspectRatio(
             AspectRatio.RATIO_16_9
@@ -2172,7 +2173,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Checks the determined RECORD size
@@ -2201,7 +2202,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Sets the target resolution as 640x480 with target rotation as ROTATION_90 because the
@@ -2229,7 +2230,7 @@
         )
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
 
         // Sets the max resolution as 720x1280
@@ -2250,13 +2251,13 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val preview = Preview.Builder().build()
         preview.setSurfaceProvider(
             CameraXExecutors.directExecutor(),
             SurfaceTextureProvider.createSurfaceTextureProvider(
-                mock<SurfaceTextureCallback>()
+                mock()
             )
         )
 
@@ -2299,13 +2300,13 @@
         setupCamera(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)
         val supportedSurfaceCombination = SupportedSurfaceCombination(
             context, fakeCameraMetadata,
-            mockCamcorderProfileAdapter
+            mockEncoderProfilesAdapter
         )
         val preview = Preview.Builder().build()
         preview.setSurfaceProvider(
             CameraXExecutors.directExecutor(),
             SurfaceTextureProvider.createSurfaceTextureProvider(
-                mock<SurfaceTextureCallback>()
+                mock()
             )
         )
 
@@ -2428,15 +2429,12 @@
             CameraCharacteristics.LENS_FACING_BACK
         )
         val cameraInfo = FakeCameraInfoInternal(fakeCameraMetadata.camera.value)
-        cameraInfo.camcorderProfileProvider = FakeCamcorderProfileProvider.Builder()
-            .addProfile(
-                CamcorderProfileUtil.asHighQuality(profileUhd),
-                profileUhd,
-                profileFhd,
-                profileHd,
-                profileSd,
-                CamcorderProfileUtil.asLowQuality(profileSd)
-            ).build()
+        cameraInfo.encoderProfilesProvider = FakeEncoderProfilesProvider.Builder()
+            .add(QUALITY_2160P, profileUhd)
+            .add(QUALITY_1080P, profileFhd)
+            .add(QUALITY_720P, profileHd)
+            .add(QUALITY_480P, profileSd)
+            .build()
         cameraFactory!!.insertCamera(
             lensFacingEnum, fakeCameraMetadata.camera.value
         ) { FakeCamera(fakeCameraMetadata.camera.value, null, cameraInfo) }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/EvCompControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/EvCompControlTest.kt
index d1c5f1c..59d5f6e 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/EvCompControlTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/EvCompControlTest.kt
@@ -17,17 +17,26 @@
 package androidx.camera.camera2.pipe.integration.impl
 
 import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.CaptureResult
 import android.os.Build
 import android.util.Range
 import android.util.Rational
+import androidx.camera.camera2.pipe.FrameNumber
+import androidx.camera.camera2.pipe.RequestNumber
 import androidx.camera.camera2.pipe.integration.adapter.RobolectricCameraPipeTestRunner
 import androidx.camera.camera2.pipe.integration.compat.EvCompImpl
 import androidx.camera.camera2.pipe.integration.testing.FakeCameraProperties
 import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCamera
 import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
+import androidx.camera.camera2.pipe.testing.FakeFrameInfo
+import androidx.camera.camera2.pipe.testing.FakeFrameMetadata
+import androidx.camera.camera2.pipe.testing.FakeRequestMetadata
 import androidx.camera.core.CameraControl
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
@@ -39,8 +48,6 @@
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
 
 @RunWith(RobolectricCameraPipeTestRunner::class)
 @DoNotInstrument
@@ -146,9 +153,68 @@
         }
     }
 
+    @Test
+    fun useCaseCameraUpdated_setExposureResultShouldPropagate(): Unit = runBlocking {
+        val targetEv = 1
+        val deferred = exposureControl.updateAsync(targetEv)
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        exposureControl.useCaseCamera = FakeUseCaseCamera()
+        comboRequestListener.simulateAeConverge(exposureValue = targetEv)
+
+        // Assert. The setEV task should be completed.
+        assertThat(deferred.awaitWithTimeout()).isEqualTo(targetEv)
+    }
+
+    @Test
+    fun useCaseCameraUpdated_onlyCompleteLatestRequest(): Unit = runBlocking {
+        val targetEv = 2
+        val deferred = exposureControl.updateAsync(1)
+
+        // Act. Simulate the UseCaseCamera is recreated,
+        exposureControl.useCaseCamera = FakeUseCaseCamera()
+        // Act. Submits a new EV value.
+        val deferred2 = exposureControl.updateAsync(targetEv)
+        comboRequestListener.simulateAeConverge(exposureValue = targetEv)
+
+        // Assert. The previous setEV task should be cancelled
+        assertThrows<CameraControl.OperationCanceledException> {
+            deferred.awaitWithTimeout()
+        }
+        // Assert. The latest setEV task should be completed.
+        assertThat(deferred2.awaitWithTimeout()).isEqualTo(targetEv)
+    }
+
     private suspend fun Deferred<Int>.awaitWithTimeout(
         timeMillis: Long = TimeUnit.SECONDS.toMillis(5)
     ) = withTimeout(timeMillis) {
         await()
     }
+
+    private fun ComboRequestListener.simulateAeConverge(
+        exposureValue: Int,
+        frameNumber: FrameNumber = FrameNumber(101L),
+    ) {
+        val requestMetadata = FakeRequestMetadata(
+            requestParameters = mapOf(
+                CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION to exposureValue
+            ),
+            requestNumber = RequestNumber(1)
+        )
+        val resultMetaData = FakeFrameMetadata(
+            resultMetadata = mapOf(
+                CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION to exposureValue,
+                CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_CONVERGED,
+            ),
+            frameNumber = frameNumber,
+        )
+        fakeUseCaseThreads.sequentialExecutor.execute {
+            onComplete(
+                requestMetadata, frameNumber, FakeFrameInfo(
+                    metadata = resultMetaData,
+                    requestMetadata = requestMetadata,
+                )
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/FlashControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/FlashControlTest.kt
new file mode 100644
index 0000000..e3559f1
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/FlashControlTest.kt
@@ -0,0 +1,237 @@
+/*
+ * 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.pipe.integration.impl
+
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CaptureRequest
+import android.os.Build
+import androidx.camera.camera2.pipe.integration.adapter.RobolectricCameraPipeTestRunner
+import androidx.camera.camera2.pipe.integration.testing.FakeCameraProperties
+import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCamera
+import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCameraRequestControl
+import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
+import androidx.camera.core.CameraControl
+import androidx.camera.core.ImageCapture
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.MoreExecutors
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeout
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class FlashControlTest {
+    private val fakeUseCaseThreads by lazy {
+        val executor = MoreExecutors.directExecutor()
+        val dispatcher = executor.asCoroutineDispatcher()
+        val cameraScope = CoroutineScope(Job() + dispatcher)
+
+        UseCaseThreads(
+            cameraScope,
+            executor,
+            dispatcher,
+        )
+    }
+    private val metadata = FakeCameraMetadata(
+        mapOf(
+            CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES to intArrayOf(
+                CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
+                CaptureRequest.CONTROL_AE_MODE_ON,
+                CaptureRequest.CONTROL_AE_MODE_OFF,
+                CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH
+            ),
+        ),
+    )
+    private val fakeRequestControl = FakeUseCaseCameraRequestControl()
+    private val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+    private val state3AControl = State3AControl(FakeCameraProperties(metadata)).apply {
+        useCaseCamera = fakeUseCaseCamera
+    }
+    private lateinit var flashControl: FlashControl
+
+    @Before
+    fun setUp() {
+        flashControl = FlashControl(
+            state3AControl = state3AControl,
+            threads = fakeUseCaseThreads,
+        )
+        flashControl.useCaseCamera = fakeUseCaseCamera
+    }
+
+    @Test
+    fun setFlash_whenInactive(): Unit = runBlocking {
+        val fakeUseCaseCamera = FakeUseCaseCamera()
+        val fakeCameraProperties = FakeCameraProperties()
+
+        val flashControl = FlashControl(
+            State3AControl(fakeCameraProperties).apply {
+                useCaseCamera = fakeUseCaseCamera
+            },
+            fakeUseCaseThreads,
+        )
+
+        assertThrows<CameraControl.OperationCanceledException> {
+            flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON).awaitWithTimeout()
+        }
+    }
+
+    @Test
+    fun setFlash_flashModeOn(): Unit = runBlocking {
+        // Arrange, clear data of the initial invocations.
+        fakeRequestControl.addParameterCalls.clear()
+
+        // Act.
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON).awaitWithTimeout()
+
+        // Assert. AE mode should change accordingly.
+        assertThat(fakeRequestControl.addParameterCalls).hasSize(1)
+        assertThat(fakeRequestControl.addParameterCalls[0]).containsAtLeastEntriesIn(
+            mapOf(CaptureRequest.CONTROL_AE_MODE to CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH)
+        )
+    }
+
+    @Test
+    fun setFlash_flashModeAuto(): Unit = runBlocking {
+        // Arrange, clear data of the initial invocations.
+        fakeRequestControl.addParameterCalls.clear()
+
+        // Act.
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_AUTO).awaitWithTimeout()
+
+        // Assert. AE mode should change accordingly.
+        assertThat(fakeRequestControl.addParameterCalls).hasSize(1)
+        assertThat(fakeRequestControl.addParameterCalls[0]).containsAtLeastEntriesIn(
+            mapOf(CaptureRequest.CONTROL_AE_MODE to CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
+        )
+    }
+
+    @Test
+    fun setFlash_flashModeOnThenOff(): Unit = runBlocking {
+        // Arrange, clear data of the initial invocations.
+        fakeRequestControl.addParameterCalls.clear()
+
+        // Act.
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON).awaitWithTimeout()
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_OFF).awaitWithTimeout()
+
+        // Assert. AE mode should change accordingly.
+        assertThat(fakeRequestControl.addParameterCalls).hasSize(2)
+        assertThat(fakeRequestControl.addParameterCalls[0]).containsAtLeastEntriesIn(
+            mapOf(CaptureRequest.CONTROL_AE_MODE to CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH)
+        )
+        assertThat(fakeRequestControl.addParameterCalls[1]).containsAtLeastEntriesIn(
+            mapOf(CaptureRequest.CONTROL_AE_MODE to CaptureRequest.CONTROL_AE_MODE_ON)
+        )
+    }
+
+    @Test
+    fun setFlashTwice_cancelPreviousFuture(): Unit = runBlocking {
+        // Arrange. Set a never complete deferred.
+        fakeRequestControl.addParameterResult = CompletableDeferred()
+
+        // Act. call setFlashAsync twice.
+        val deferred = flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+
+        assertThrows<CameraControl.OperationCanceledException> {
+            deferred.awaitWithTimeout()
+        }
+    }
+
+    @Test
+    fun setInActive_cancelPreviousFuture(): Unit = runBlocking {
+        // Arrange. Set a never complete deferred.
+        fakeRequestControl.addParameterResult = CompletableDeferred()
+        val deferred = flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+
+        // Act. call reset & clear the UseCaseCamera.
+        flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+        flashControl.reset()
+        flashControl.useCaseCamera = null
+
+        assertThrows<CameraControl.OperationCanceledException> {
+            deferred.awaitWithTimeout()
+        }
+    }
+
+    @Test
+    fun useCaseCameraUpdated_setFlashResultShouldPropagate(): Unit = runBlocking {
+        // Arrange.
+        fakeRequestControl.addParameterResult = CompletableDeferred()
+
+        val deferred = flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            addParameterResult = CompletableDeferred()
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        flashControl.useCaseCamera = fakeUseCaseCamera
+        state3AControl.useCaseCamera = fakeUseCaseCamera
+
+        // Simulate setFlash is completed on the recreated UseCaseCamera
+        fakeRequestControl.addParameterResult.complete(Unit)
+
+        // Assert. The setFlash task should be completed.
+        assertThat(deferred.awaitWithTimeout()).isNotNull()
+    }
+
+    @Test
+    fun useCaseCameraUpdated_onlyCompleteLatestRequest(): Unit = runBlocking {
+        // Arrange.
+        fakeRequestControl.addParameterResult = CompletableDeferred()
+
+        val deferred = flashControl.setFlashAsync(ImageCapture.FLASH_MODE_ON)
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            addParameterResult = CompletableDeferred()
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        flashControl.useCaseCamera = fakeUseCaseCamera
+        state3AControl.useCaseCamera = fakeUseCaseCamera
+        // Act. Submits a new Flash mode.
+        val deferred2 = flashControl.setFlashAsync(ImageCapture.FLASH_MODE_AUTO)
+        // Simulate setFlash is completed on the recreated UseCaseCamera
+        fakeRequestControl.addParameterResult.complete(Unit)
+
+        // Assert. The previous set Flash mode task should be cancelled
+        assertThrows<CameraControl.OperationCanceledException> {
+            deferred.awaitWithTimeout()
+        }
+        // Assert. The latest set Flash mode task should be completed.
+        assertThat(deferred2.awaitWithTimeout()).isNotNull()
+    }
+
+    private suspend fun <T> Deferred<T>.awaitWithTimeout(
+        timeMillis: Long = TimeUnit.SECONDS.toMillis(5)
+    ) = withTimeout(timeMillis) {
+        await()
+    }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/TorchControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/TorchControlTest.kt
index 6b24bc2..8aeaf43 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/TorchControlTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/TorchControlTest.kt
@@ -17,29 +17,23 @@
 package androidx.camera.camera2.pipe.integration.impl
 
 import android.hardware.camera2.CameraCharacteristics
-import android.hardware.camera2.CaptureRequest
-import android.hardware.camera2.params.MeteringRectangle
 import android.os.Build
-import androidx.camera.camera2.pipe.AeMode
-import androidx.camera.camera2.pipe.Request
-import androidx.camera.camera2.pipe.RequestTemplate
 import androidx.camera.camera2.pipe.Result3A
-import androidx.camera.camera2.pipe.StreamId
 import androidx.camera.camera2.pipe.integration.adapter.RobolectricCameraPipeTestRunner
 import androidx.camera.camera2.pipe.integration.testing.FakeCameraProperties
 import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCamera
+import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCameraRequestControl
 import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
 import androidx.camera.core.CameraControl
 import androidx.camera.core.TorchState
-import androidx.camera.core.impl.CaptureConfig
-import androidx.camera.core.impl.SessionConfig
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.Observer
 import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth
+import com.google.common.util.concurrent.MoreExecutors
 import java.util.Objects
-import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
@@ -48,7 +42,7 @@
 import kotlinx.coroutines.asCoroutineDispatcher
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import org.junit.AfterClass
+import kotlinx.coroutines.withTimeout
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -62,7 +56,7 @@
 class TorchControlTest {
 
     companion object {
-        private val executor = Executors.newSingleThreadExecutor()
+        private val executor = MoreExecutors.directExecutor()
         private val fakeUseCaseThreads by lazy {
             val dispatcher = executor.asCoroutineDispatcher()
             val cameraScope = CoroutineScope(Job() + dispatcher)
@@ -73,12 +67,6 @@
                 dispatcher
             )
         }
-
-        @JvmStatic
-        @AfterClass
-        fun close() {
-            executor.shutdown()
-        }
     }
 
     private val metadata = FakeCameraMetadata(
@@ -87,60 +75,9 @@
         ),
     )
 
-    private val neverCompleteTorchRequestControl = object : UseCaseCameraRequestControl {
-        override fun addParametersAsync(
-            type: UseCaseCameraRequestControl.Type,
-            values: Map<CaptureRequest.Key<*>, Any>,
-            optionPriority: androidx.camera.core.impl.Config.OptionPriority,
-            tags: Map<String, Any>,
-            streams: Set<StreamId>?,
-            template: RequestTemplate?,
-            listeners: Set<Request.Listener>
-        ): Deferred<Unit> {
-            return CompletableDeferred(Unit)
-        }
-
-        override fun setConfigAsync(
-            type: UseCaseCameraRequestControl.Type,
-            config: androidx.camera.core.impl.Config?,
-            tags: Map<String, Any>,
-            streams: Set<StreamId>?,
-            template: RequestTemplate?,
-            listeners: Set<Request.Listener>
-        ): Deferred<Unit> {
-            return CompletableDeferred(Unit)
-        }
-
-        override fun setSessionConfigAsync(sessionConfig: SessionConfig): Deferred<Unit> {
-            return CompletableDeferred(Unit)
-        }
-
-        override suspend fun setTorchAsync(enabled: Boolean): Deferred<Result3A> {
-            // Return a CompletableDeferred without set it to completed.
-            return CompletableDeferred()
-        }
-
-        override suspend fun startFocusAndMeteringAsync(
-            aeRegions: List<MeteringRectangle>,
-            afRegions: List<MeteringRectangle>,
-            awbRegions: List<MeteringRectangle>,
-            afTriggerStartAeMode: AeMode?
-        ): Deferred<Result3A> {
-            return CompletableDeferred(Result3A(status = Result3A.Status.OK))
-        }
-
-        override suspend fun cancelFocusAndMeteringAsync(): Deferred<Result3A> {
-            return CompletableDeferred(Result3A(status = Result3A.Status.OK))
-        }
-
-        override suspend fun issueSingleCaptureAsync(
-            captureSequence: List<CaptureConfig>,
-            captureMode: Int,
-            flashType: Int,
-            flashMode: Int,
-        ): List<Deferred<Void?>> {
-            return listOf(CompletableDeferred(null))
-        }
+    private val neverCompleteTorchRequestControl = FakeUseCaseCameraRequestControl().apply {
+        // Set a CompletableDeferred without set it to completed.
+        setTorchResult = CompletableDeferred()
     }
 
     private lateinit var torchControl: TorchControl
@@ -309,4 +246,59 @@
         Truth.assertThat(receivedTorchState[1]).isEqualTo(TorchState.ON) // by setTorchAsync(true)
         Truth.assertThat(receivedTorchState[2]).isEqualTo(TorchState.OFF) // by setTorchAsync(false)
     }
+
+    @Test
+    fun useCaseCameraUpdated_setTorchResultShouldPropagate(): Unit = runBlocking {
+        // Arrange.
+        torchControl.useCaseCamera =
+            FakeUseCaseCamera(requestControl = neverCompleteTorchRequestControl)
+
+        val deferred = torchControl.setTorchAsync(true)
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            setTorchResult = CompletableDeferred<Result3A>()
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        torchControl.useCaseCamera = fakeUseCaseCamera
+
+        // Simulate setTorch is completed in the recreated UseCaseCamera
+        fakeRequestControl.setTorchResult.complete(Result3A(status = Result3A.Status.OK))
+
+        // Assert. The setTorch task should be completed.
+        Truth.assertThat(deferred.awaitWithTimeout()).isNotNull()
+    }
+
+    @Test
+    fun useCaseCameraUpdated_onlyCompleteLatestRequest(): Unit = runBlocking {
+        // Arrange.
+        torchControl.useCaseCamera =
+            FakeUseCaseCamera(requestControl = neverCompleteTorchRequestControl)
+
+        val deferred = torchControl.setTorchAsync(true)
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            setTorchResult = CompletableDeferred()
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        torchControl.useCaseCamera = fakeUseCaseCamera
+        // Act. Set Torch mode again.
+        val deferred2 = torchControl.setTorchAsync(false)
+        // Simulate setTorch is completed in the recreated UseCaseCamera
+        fakeRequestControl.setTorchResult.complete(Result3A(status = Result3A.Status.OK))
+
+        // Assert. The previous setTorch task should be cancelled
+        assertThrows<CameraControl.OperationCanceledException> {
+            deferred.awaitWithTimeout()
+        }
+        // Assert. The latest setTorch task should be completed.
+        Truth.assertThat(deferred2.awaitWithTimeout()).isNotNull()
+    }
+
+    private suspend fun <T> Deferred<T>.awaitWithTimeout(
+        timeMillis: Long = TimeUnit.SECONDS.toMillis(5)
+    ) = withTimeout(timeMillis) {
+        await()
+    }
 }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/ZoomControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/ZoomControlTest.kt
index 600f8ab..1abf1d4 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/ZoomControlTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/ZoomControlTest.kt
@@ -54,7 +54,7 @@
         )
     }
 
-    private val zoomCompat = FakeZoomCompat()
+    private val zoomCompat = FakeZoomCompat(1.0f, 5.0f)
     private lateinit var zoomControl: ZoomControl
 
     @Before
@@ -66,9 +66,9 @@
 
     @Test
     fun canUpdateZoomRatioInCompat() {
-        zoomControl.setZoomRatioAsync(3.0f)[3, TimeUnit.SECONDS]
+        zoomControl.setZoomRatio(3.0f)[3, TimeUnit.SECONDS]
 
-        Truth.assertWithMessage("zoomState did not return default zoom state successfully")
+        Truth.assertWithMessage("zoomCompat not updated with correct zoom ratio")
             .that(zoomCompat.zoomRatio)
             .isEqualTo(3.0f)
     }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/ZoomMathTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/ZoomMathTest.kt
new file mode 100644
index 0000000..f2fe667
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/ZoomMathTest.kt
@@ -0,0 +1,185 @@
+/*
+ * 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.pipe.integration.internal
+
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getLinearZoomFromZoomRatio
+import androidx.camera.camera2.pipe.integration.internal.ZoomMath.getZoomRatioFromLinearZoom
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+private const val CROP_REGION_TOLERANCE = 5f
+class ZoomMathTest {
+    private val minZoomRatio = 0.6f
+    private val maxZoomRatio = 8f
+
+    @Test
+    fun getLinearZoomFromZoomRatio_zoomRatioIsMin_linearZoomIs0() {
+        val linearZoom = getLinearZoomFromZoomRatio(
+            zoomRatio = minZoomRatio,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        assertThat(linearZoom).isEqualTo(0f)
+    }
+
+    @Test
+    fun getLinearZoomFromZoomRatio_zoomRatioIsMax_linearZoomIs1() {
+        val linearZoom = getLinearZoomFromZoomRatio(
+            zoomRatio = maxZoomRatio,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        assertThat(linearZoom).isEqualTo(1f)
+    }
+
+    @Test
+    fun getLinearZoomFromZoomRatio_zoomUnsupported_linearZoomIs0() {
+        // zoom unsupported means minZoomRatio = maxZoomRatio
+        val linearZoom = getLinearZoomFromZoomRatio(
+            zoomRatio = 1.0f,
+            minZoomRatio = 1.0f,
+            maxZoomRatio = 1.0f
+        )
+
+        assertThat(linearZoom).isEqualTo(0f)
+    }
+
+    @Test
+    fun getZoomRatioFromLinearZoom_linearZoomIs0_zoomRatioIsMin() {
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 0f,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        assertThat(zoomRatio).isEqualTo(minZoomRatio)
+    }
+
+    @Test
+    fun getZoomRatioFromLinearZoom_linearZoomIs1_zoomRatioIsMax() {
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 1.0f,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        assertThat(zoomRatio).isEqualTo(maxZoomRatio)
+    }
+
+    @Test
+    fun getZoomRatioFromLinearZoom_zoomUnsupportedAndLinearZoom0_zoomRatioIsTheAllowedValue() {
+        // zoom unsupported means minZoomRatio = maxZoomRatio
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 0f,
+            minZoomRatio = 1.0f,
+            maxZoomRatio = 1.0f
+        )
+
+        assertThat(zoomRatio).isEqualTo(1.0f)
+    }
+
+    @Test
+    fun getZoomRatioFromLinearZoom_zoomUnsupportedAndLinearZoom0_5f_zoomRatioIsTheAllowedValue() {
+        // zoom unsupported means minZoomRatio = maxZoomRatio
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 0.5f,
+            minZoomRatio = 1.0f,
+            maxZoomRatio = 1.0f
+        )
+
+        assertThat(zoomRatio).isEqualTo(1.0f)
+    }
+
+    @Test
+    fun getZoomRatioFromLinearZoom_zoomUnsupportedAndLinearZoom1_zoomRatioIsTheAllowedValue() {
+        // zoom unsupported means minZoomRatio = maxZoomRatio
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 1.0f,
+            minZoomRatio = 1.0f,
+            maxZoomRatio = 1.0f
+        )
+
+        assertThat(zoomRatio).isEqualTo(1.0f)
+    }
+
+    @Test
+    fun getLinearZoomFromZoomRatio_getZoomRatioFromLinearZoomReturnsSameRatio() {
+        val linearZoom = getLinearZoomFromZoomRatio(
+            zoomRatio = 2f,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = linearZoom,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+
+        assertThat(zoomRatio).isEqualTo(2f)
+    }
+
+    @Test
+    fun linearZoomIs0_5f_cropWidthIsHalf() {
+        val sensorRegionWidth = 10000f
+        val minZoomCropWidth = sensorRegionWidth / minZoomRatio
+        val maxZoomCropWidth = sensorRegionWidth / maxZoomRatio
+
+        val zoomRatio = getZoomRatioFromLinearZoom(
+            linearZoom = 0.5f,
+            minZoomRatio = minZoomRatio,
+            maxZoomRatio = maxZoomRatio
+        )
+        val cropWidth = sensorRegionWidth / zoomRatio
+
+        assertThat(cropWidth)
+            .isWithin(CROP_REGION_TOLERANCE)
+            .of((minZoomCropWidth + maxZoomCropWidth) / 2)
+    }
+
+    @Test
+    fun linearZoomIsIncreasedProgressively_cropWidthIsChangedLinearly() {
+        val sensorRegionWidth = 10000f
+        var previousCropWidth = sensorRegionWidth / minZoomRatio
+        var previousCropWidthDiff = Float.NaN
+
+        var linearZoom = 0.1f
+
+        while (linearZoom < 1f) {
+            val zoomRatio = getZoomRatioFromLinearZoom(
+                linearZoom = linearZoom,
+                minZoomRatio = minZoomRatio,
+                maxZoomRatio = maxZoomRatio
+            )
+
+            val cropWidth = sensorRegionWidth / zoomRatio
+            val cropWidthDiff = previousCropWidth - cropWidth
+
+            if (!previousCropWidthDiff.isNaN()) {
+                assertThat(cropWidthDiff)
+                    .isWithin(CROP_REGION_TOLERANCE)
+                    .of(previousCropWidthDiff)
+            }
+
+            previousCropWidthDiff = cropWidthDiff
+            previousCropWidth = cropWidth
+            linearZoom += 0.1f
+        }
+    }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControlTest.kt
index 5bcde30..efeb07f 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControlTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControlTest.kt
@@ -16,9 +16,36 @@
 
 package androidx.camera.camera2.pipe.integration.interop
 
+import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.CaptureResult
 import android.os.Build
+import androidx.camera.camera2.pipe.FrameNumber
+import androidx.camera.camera2.pipe.RequestNumber
 import androidx.camera.camera2.pipe.integration.adapter.RobolectricCameraPipeTestRunner
+import androidx.camera.camera2.pipe.integration.compat.Camera2CameraControlCompatImpl
+import androidx.camera.camera2.pipe.integration.impl.CAMERAX_TAG_BUNDLE
+import androidx.camera.camera2.pipe.integration.impl.ComboRequestListener
+import androidx.camera.camera2.pipe.integration.impl.UseCaseCameraRequestControl
+import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
+import androidx.camera.camera2.pipe.integration.impl.toParameters
+import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCamera
+import androidx.camera.camera2.pipe.integration.testing.FakeUseCaseCameraRequestControl
+import androidx.camera.camera2.pipe.testing.FakeFrameInfo
+import androidx.camera.camera2.pipe.testing.FakeFrameMetadata
+import androidx.camera.camera2.pipe.testing.FakeRequestMetadata
 import androidx.camera.core.impl.CameraControlInternal
+import androidx.camera.core.impl.MutableTagBundle
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.MoreExecutors
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
@@ -28,10 +55,147 @@
 @OptIn(ExperimentalCamera2Interop::class)
 class Camera2CameraControlTest {
 
+    private val fakeUseCaseThreads by lazy {
+        val executor = MoreExecutors.directExecutor()
+        val dispatcher = executor.asCoroutineDispatcher()
+        val cameraScope = CoroutineScope(Job() + dispatcher)
+
+        UseCaseThreads(
+            cameraScope,
+            executor,
+            dispatcher,
+        )
+    }
+    private val comboRequestListener = ComboRequestListener()
+    private val fakeRequestControl = FakeUseCaseCameraRequestControl()
+    private val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+    private val camera2CameraControlCompatImpl = Camera2CameraControlCompatImpl(fakeUseCaseThreads)
+    private lateinit var camera2CameraControl: Camera2CameraControl
+
+    @Before
+    fun setUp() {
+        camera2CameraControl = Camera2CameraControl.create(
+            compat = camera2CameraControlCompatImpl,
+            threads = fakeUseCaseThreads,
+            requestListener = comboRequestListener,
+        )
+        camera2CameraControl.useCaseCamera = fakeUseCaseCamera
+    }
+
+    @Test
+    fun useCaseCameraUpdated_setRequestOptionResultShouldPropagate(): Unit = runBlocking {
+        // Arrange.
+        val completeDeferred = CompletableDeferred<Unit>()
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            setConfigResult = completeDeferred
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        val resultFuture = camera2CameraControl.setCaptureRequestOptions(
+            CaptureRequestOptions.Builder().setCaptureRequestOption(
+                CaptureRequest.CONTROL_AE_MODE,
+                CaptureRequest.CONTROL_AE_MODE_OFF
+            ).build()
+        )
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        camera2CameraControl.useCaseCamera = fakeUseCaseCamera
+        // Simulate setRequestOption is completed in the recreated UseCaseCamera
+        completeDeferred.complete(Unit)
+        val requestsToCamera = fakeRequestControl.setConfigCalls.filter {
+            it.type == UseCaseCameraRequestControl.Type.CAMERA2_CAMERA_CONTROL
+        }.onEach { request ->
+            comboRequestListener.simulateRepeatingResult(
+                requests = request.config?.toParameters() ?: emptyMap(),
+                tags = request.tags,
+            )
+        }
+
+        // Assert. The setRequestOption task should be completed.
+        assertThat(requestsToCamera).isNotEmpty()
+        assertThat(resultFuture.get(3, TimeUnit.SECONDS)).isNull()
+    }
+
+    @Test
+    fun useCaseCameraUpdated_onlyCompleteLatestRequest(): Unit = runBlocking {
+        // Arrange.
+        val completeDeferred = CompletableDeferred<Unit>()
+        val fakeRequestControl = FakeUseCaseCameraRequestControl().apply {
+            setConfigResult = completeDeferred
+        }
+        val fakeUseCaseCamera = FakeUseCaseCamera(requestControl = fakeRequestControl)
+
+        val resultFuture = camera2CameraControl.setCaptureRequestOptions(
+            CaptureRequestOptions.Builder().setCaptureRequestOption(
+                CaptureRequest.CONTROL_AE_MODE,
+                CaptureRequest.CONTROL_AE_MODE_OFF
+            ).build()
+        )
+
+        // Act. Simulate the UseCaseCamera is recreated.
+        camera2CameraControl.useCaseCamera = fakeUseCaseCamera
+        // Act. Submit a new request option.
+        val resultFuture2 = camera2CameraControl.setCaptureRequestOptions(
+            CaptureRequestOptions.Builder().setCaptureRequestOption(
+                CaptureRequest.CONTROL_AE_MODE,
+                CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH
+            ).build()
+        )
+        // Simulate setRequestOption is completed in the recreated UseCaseCamera
+        completeDeferred.complete(Unit)
+        val requestsToCamera = fakeRequestControl.setConfigCalls.filter {
+            it.type == UseCaseCameraRequestControl.Type.CAMERA2_CAMERA_CONTROL
+        }.onEach { request ->
+            comboRequestListener.simulateRepeatingResult(
+                requests = request.config?.toParameters() ?: emptyMap(),
+                tags = request.tags,
+            )
+        }
+
+        // Assert. The first request should be cancelled., the latest setRequestOption
+        // task should be completed.
+        assertThat(requestsToCamera).isNotEmpty()
+        assertThrows<ExecutionException> {
+            resultFuture.get(3, TimeUnit.SECONDS)
+        }
+        assertThat(resultFuture2.get(3, TimeUnit.SECONDS)).isNull()
+    }
+
     @Test(expected = IllegalArgumentException::class)
     fun fromCameraControlThrows_whenNotCamera2Impl() {
         val wrongCameraControl =
             CameraControlInternal.DEFAULT_EMPTY_INSTANCE
         Camera2CameraControl.from(wrongCameraControl)
     }
+
+    private fun ComboRequestListener.simulateRepeatingResult(
+        requests: Map<CaptureRequest.Key<*>, Any> = emptyMap(),
+        tags: Map<String, Any> = emptyMap(),
+        results: Map<CaptureResult.Key<*>, Any> = emptyMap(),
+        frameNumber: FrameNumber = FrameNumber(101L),
+    ) {
+        val requestMetadata = FakeRequestMetadata(
+            requestParameters = requests,
+            metadata = mapOf(
+                CAMERAX_TAG_BUNDLE to MutableTagBundle.create().also { tagBundle ->
+                    tags.forEach { (tagKey, tagValue) ->
+                        tagBundle.putTag(tagKey, tagValue)
+                    }
+                }
+            ),
+            requestNumber = RequestNumber(1)
+        )
+        val resultMetaData = FakeFrameMetadata(
+            resultMetadata = results,
+            frameNumber = frameNumber,
+        )
+        fakeUseCaseThreads.sequentialExecutor.execute {
+            onComplete(
+                requestMetadata, frameNumber, FakeFrameInfo(
+                    metadata = resultMetaData,
+                    requestMetadata = requestMetadata,
+                )
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfoTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfoTest.kt
index aab5b2d..d2f18b7 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfoTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfoTest.kt
@@ -28,9 +28,9 @@
 import androidx.camera.core.CameraState
 import androidx.camera.core.ExposureState
 import androidx.camera.core.ZoomState
-import androidx.camera.core.impl.CamcorderProfileProvider
 import androidx.camera.core.impl.CameraCaptureCallback
 import androidx.camera.core.impl.CameraInfoInternal
+import androidx.camera.core.impl.EncoderProfilesProvider
 import androidx.camera.core.impl.Quirks
 import androidx.camera.core.impl.Timebase
 import androidx.lifecycle.LiveData
@@ -153,7 +153,7 @@
                 throw NotImplementedError("Not used in testing")
             }
 
-            override fun getCamcorderProfileProvider(): CamcorderProfileProvider {
+            override fun getEncoderProfilesProvider(): EncoderProfilesProvider {
                 throw NotImplementedError("Not used in testing")
             }
 
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCamera2CameraControlCompat.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCamera2CameraControlCompat.kt
index 79e9e2c..13cc26d 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCamera2CameraControlCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCamera2CameraControlCompat.kt
@@ -41,7 +41,7 @@
         // No-op
     }
 
-    override fun applyAsync(camera: UseCaseCamera?): Deferred<Void?> {
+    override fun applyAsync(camera: UseCaseCamera?, cancelPreviousTask: Boolean): Deferred<Void?> {
         return CompletableDeferred(null)
     }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCameraInfoAdapterCreator.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCameraInfoAdapterCreator.kt
index e98ffc8..1a796be 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCameraInfoAdapterCreator.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeCameraInfoAdapterCreator.kt
@@ -98,7 +98,8 @@
             FocusMeteringControl(
                 cameraProperties,
                 state3AControl,
-                useCaseThreads
+                useCaseThreads,
+                FakeZoomCompat(),
             ).apply {
                 useCaseCamera = fakeUseCaseCamera
             }
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeEvCompCompat.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeEvCompCompat.kt
index a8d73d5..afd3de9 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeEvCompCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeEvCompCompat.kt
@@ -25,13 +25,17 @@
 class FakeEvCompCompat constructor(
     override val supported: Boolean = false,
     override val range: Range<Int> = Range(0, 0),
-    override val step: Rational = Rational.ZERO
+    override val step: Rational = Rational.ZERO,
 ) : EvCompCompat {
-    override fun stopRunningTask() {
+    override fun stopRunningTask(throwable: Throwable) {
         TODO("Not yet implemented")
     }
 
-    override fun applyAsync(evCompIndex: Int, camera: UseCaseCamera): Deferred<Int> {
+    override fun applyAsync(
+        evCompIndex: Int,
+        camera: UseCaseCamera,
+        cancelPreviousTask: Boolean,
+    ): Deferred<Int> {
         TODO("Not yet implemented")
     }
 }
\ No newline at end of file
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 9ec74a1..d98a07d 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
@@ -59,6 +59,13 @@
 
 // TODO: Further implement the methods in this class as needed
 open class FakeUseCaseCameraRequestControl : UseCaseCameraRequestControl {
+
+    val addParameterCalls = mutableListOf<Map<CaptureRequest.Key<*>, Any>>()
+    var addParameterResult = CompletableDeferred(Unit)
+    var setConfigCalls = mutableListOf<RequestParameters>()
+    var setConfigResult = CompletableDeferred(Unit)
+    var setTorchResult = CompletableDeferred(Result3A(status = Result3A.Status.OK))
+
     override fun addParametersAsync(
         type: UseCaseCameraRequestControl.Type,
         values: Map<CaptureRequest.Key<*>, Any>,
@@ -68,7 +75,8 @@
         template: RequestTemplate?,
         listeners: Set<Request.Listener>
     ): Deferred<Unit> {
-        return CompletableDeferred(Unit)
+        addParameterCalls.add(values)
+        return addParameterResult
     }
 
     override fun setConfigAsync(
@@ -79,6 +87,7 @@
         template: RequestTemplate?,
         listeners: Set<Request.Listener>
     ): Deferred<Unit> {
+        setConfigCalls.add(RequestParameters(type, config, tags))
         return CompletableDeferred(Unit)
     }
 
@@ -87,7 +96,7 @@
     }
 
     override suspend fun setTorchAsync(enabled: Boolean): Deferred<Result3A> {
-        return CompletableDeferred(Result3A(status = Result3A.Status.OK))
+        return setTorchResult
     }
 
     val focusMeteringCalls = mutableListOf<FocusMeteringParams>()
@@ -127,6 +136,12 @@
         val awbRegions: List<MeteringRectangle> = emptyList(),
         val afTriggerStartAeMode: AeMode? = null
     )
+
+    data class RequestParameters(
+        val type: UseCaseCameraRequestControl.Type,
+        val config: Config?,
+        val tags: Map<String, Any> = emptyMap(),
+    )
 }
 
 // TODO: Further implement the methods in this class as needed
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeZoomCompat.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeZoomCompat.kt
index cabac1a..e48a1d9 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeZoomCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeZoomCompat.kt
@@ -16,16 +16,20 @@
 
 package androidx.camera.camera2.pipe.integration.testing
 
+import android.graphics.Rect
 import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
 import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera
 
 class FakeZoomCompat constructor(
-    override val minZoom: Float = 0f,
-    override val maxZoom: Float = 0f,
+    override val minZoomRatio: Float = 0f,
+    override val maxZoomRatio: Float = 0f,
+    var croppedSensorArea: Rect = Rect(0, 0, 640, 480),
 ) : ZoomCompat {
     var zoomRatio = 0f
 
     override fun apply(zoomRatio: Float, camera: UseCaseCamera) {
         this.zoomRatio = zoomRatio
     }
+
+    override fun getCropSensorRegion() = croppedSensorArea
 }
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/java/androidx/camera/camera2/pipe/testing/CameraControllerSimulator.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraControllerSimulator.kt
index 26cbb85..6f6f637 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraControllerSimulator.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraControllerSimulator.kt
@@ -21,6 +21,7 @@
 import androidx.camera.camera2.pipe.CameraContext
 import androidx.camera.camera2.pipe.CameraController
 import androidx.camera.camera2.pipe.CameraGraph
+import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.GraphState.GraphStateError
 import androidx.camera.camera2.pipe.StreamGraph
 import androidx.camera.camera2.pipe.StreamId
@@ -45,6 +46,9 @@
     private val graphListener: GraphListener,
     private val streamGraph: StreamGraph
 ) : CameraController {
+    override val cameraId: CameraId
+        get() = graphConfig.camera
+
     private val lock = Any()
     private var currentSurfaceMap: Map<StreamId, Surface> = emptyMap()
     private var currentGraphRequestProcessor: GraphRequestProcessor? = null
@@ -152,10 +156,23 @@
 
     override fun stop() {
         synchronized(lock) {
+            check(!closed) {
+                "Attempted to invoke stop after close."
+            }
             started = false
         }
     }
 
+    override fun tryRestart() {
+        synchronized(lock) {
+            check(!closed) {
+                "Attempted to invoke restart after close."
+            }
+            stop()
+            start()
+        }
+    }
+
     override fun close() {
         synchronized(lock) {
             closed = true
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraBackend.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraBackend.kt
index eaaa2eb..1e1f6a3 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraBackend.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraBackend.kt
@@ -24,10 +24,13 @@
 import androidx.camera.camera2.pipe.CameraGraph
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
+import androidx.camera.camera2.pipe.CameraStatusMonitor
 import androidx.camera.camera2.pipe.StreamGraph
 import androidx.camera.camera2.pipe.graph.GraphListener
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
 
 /**
  * The FakeCameraBackend implements [CameraBackend] and creates [CameraControllerSimulator]s.
@@ -43,6 +46,8 @@
 
     override val id: CameraBackendId
         get() = FAKE_CAMERA_BACKEND_ID
+    override val cameraStatus: Flow<CameraStatusMonitor.CameraStatus>
+        get() = MutableSharedFlow()
 
     override fun awaitCameraIds(): List<CameraId> = fakeCameraIds
 
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/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt
index ba21764..66cbd6f 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
@@ -17,10 +17,26 @@
 
 import androidx.camera.camera2.pipe.graph.GraphListener
 import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.flow.Flow
 
 /** This is used to uniquely identify a specific backend implementation. */
 @JvmInline
-value class CameraBackendId(public val value: String)
+value class CameraBackendId(val value: String)
+
+/**
+ * A CameraStatusMonitors monitors the status of the cameras, and emits updates when the status of
+ * cameras changes, for instance when the camera access priorities have changed or when a particular
+ * camera has become available.
+ */
+interface CameraStatusMonitor {
+    val cameraStatus: Flow<CameraStatus>
+
+    abstract class CameraStatus internal constructor() {
+        object CameraPrioritiesChanged : CameraStatus()
+
+        class CameraAvailable(val cameraId: CameraId) : CameraStatus()
+    }
+}
 
 /**
  * A CameraBackend is used by [CameraPipe] to abstract out the lifecycle, state, and interactions
@@ -38,6 +54,12 @@
     val id: CameraBackendId
 
     /**
+     * A flow of camera statuses that provide camera status updates such as when the camera access
+     * priorities have changed, or a certain camera has become available.
+     */
+    val cameraStatus: Flow<CameraStatusMonitor.CameraStatus>
+
+    /**
      * Read out a list of _openable_ [CameraId]s for this backend. The backend may be able to report
      * Metadata for non-openable cameras. However, these cameras should not appear the list of
      * cameras returned by [getCameraIds].
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraController.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraController.kt
index 0eacef9..29dee61 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraController.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraController.kt
@@ -17,6 +17,7 @@
 package androidx.camera.camera2.pipe
 
 import android.view.Surface
+import androidx.camera.camera2.pipe.CameraController.ControllerState.CLOSED
 import androidx.camera.camera2.pipe.graph.GraphListener
 
 /**
@@ -35,8 +36,10 @@
  * Once [close] is invoked, this instance should not respond to any additional events.
  */
 interface CameraController {
+    val cameraId: CameraId
+
     /**
-     * Connect and start the underlying camera.This may be called on the main thread and should not
+     * Connect and start the underlying camera. This may be called on the main thread and should not
      * make long blocking calls. This may be called opportunistically (eg, whenever a lifecycle
      * indicates the camera should be in a running state)
      */
@@ -49,6 +52,13 @@
     fun stop()
 
     /**
+     * Restart the current session. This should basically perform stop() then start(). However, the
+     * implementation should handle its internal states correctly, and only restart when the
+     * conditions are appropriate.
+     */
+    fun tryRestart()
+
+    /**
      * Close this instance. [start] and [stop] should not be invoked, and any additional calls will
      * be ignored once this method returns. Depending on implementation the underlying camera
      * connection may not be terminated immediately, depending on the [CameraBackend]
@@ -61,4 +71,40 @@
      * missing from the [StreamGraph] that was used to create this [CameraController].
      */
     fun updateSurfaceMap(surfaceMap: Map<StreamId, Surface>)
+
+    /**
+     * ControllerState indicates the internal state of a [CameraController]. These states are needed
+     * to make sure we only invoke [CameraController] methods under the right conditions.
+     *
+     * The following diagram illustrates the state transitions (all states also have a permissible
+     * transition to [CLOSED]).
+     *
+     *   ```
+     *   [STOPPED] --> [STARTED] --> [STOPPING] ---------.--------.
+     *      ^              ^             |               |        |
+     *      |              |             V               V        |
+     *      |              '---------[DISCONNECTED]   [ERROR]     |
+     *      |                                                     |
+     *      '-----------------------------------------------------'
+     *   ```
+     */
+    abstract class ControllerState internal constructor() {
+        /** When the CameraController is started. This is set immediately as start() is called. */
+        object STARTED : ControllerState()
+
+        /** When the CameraController is stopping. This is set immediately as stop() is called. */
+        object STOPPING : ControllerState()
+
+        /** When the camera is stopped normally. */
+        object STOPPED : ControllerState()
+
+        /** When the camera is disconnected and can be later "reconnected". */
+        object DISCONNECTED : ControllerState()
+
+        /** When the camera shuts down with an unrecoverable error. */
+        object ERROR : ControllerState()
+
+        /** When the CameraController is closed, and no further operations can done on it. */
+        object CLOSED : ControllerState()
+    }
 }
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 8aa550c..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.
@@ -66,7 +66,7 @@
         replaceWith = ReplaceWith("awaitCameraIds"),
         level = DeprecationLevel.WARNING
     )
-    public fun findAll(): List<CameraId>
+    fun findAll(): List<CameraId>
 
     /**
      * Load the list of CameraIds from the Camera2 CameraManager, suspending if the list of
@@ -77,7 +77,7 @@
         replaceWith = ReplaceWith("getCameraIds"),
         level = DeprecationLevel.WARNING
     )
-    public suspend fun ids(): List<CameraId>
+    suspend fun ids(): List<CameraId>
 
     /**
      * Load CameraMetadata for a specific CameraId. Loading CameraMetadata can take a non-zero
@@ -89,7 +89,7 @@
         replaceWith = ReplaceWith("getCameraMetadata"),
         level = DeprecationLevel.WARNING
     )
-    public suspend fun getMetadata(camera: CameraId): CameraMetadata
+    suspend fun getMetadata(camera: CameraId): CameraMetadata
 
     /**
      * Load CameraMetadata for a specific CameraId and block the calling thread until the result is
@@ -100,14 +100,23 @@
         replaceWith = ReplaceWith("awaitCameraMetadata"),
         level = DeprecationLevel.WARNING
     )
-    public fun awaitMetadata(camera: CameraId): CameraMetadata
+    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")
     }
 
     /**
@@ -115,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"
 }
 
 /**
@@ -124,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 {
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 2f647e8..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 d5e8cf2..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()
     )
 
@@ -187,7 +187,7 @@
             "CameraPipe.External is deprecated, use customCameraBackend on " +
                 "GraphConfig instead."
         )
-        public fun create(
+        fun create(
             config: CameraGraph.Config,
             cameraMetadata: CameraMetadata,
             requestProcessor: RequestProcessor
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 4278c31..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,7 +45,7 @@
  */
 @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()
 
@@ -95,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)
@@ -106,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 19022c4..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,13 +28,13 @@
  *
  * 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 {
+    class Key<T> private constructor(private val name: String) {
+        companion object {
             @JvmStatic
             internal val keys: MutableSet<String> = HashSet()
 
@@ -46,7 +42,7 @@
              * 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)
             }
@@ -57,181 +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 69f12de..0000000
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
+++ /dev/null
@@ -1,236 +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 d8b286f..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
@@ -66,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(
@@ -117,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"
 }
 
@@ -127,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
 
     /**
@@ -146,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(
@@ -371,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/Camera2Backend.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2Backend.kt
index 343a8cb..f78fd57 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
@@ -24,6 +24,7 @@
 import androidx.camera.camera2.pipe.CameraGraph
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
+import androidx.camera.camera2.pipe.CameraStatusMonitor.CameraStatus
 import androidx.camera.camera2.pipe.StreamGraph
 import androidx.camera.camera2.pipe.config.Camera2ControllerComponent
 import androidx.camera.camera2.pipe.config.Camera2ControllerConfig
@@ -33,6 +34,7 @@
 import javax.inject.Inject
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.flow.Flow
 
 /** This is the default [CameraBackend] implementation for CameraPipe based on Camera2. */
 @RequiresApi(21)
@@ -44,9 +46,12 @@
     private val camera2MetadataCache: Camera2MetadataCache,
     private val virtualCameraManager: VirtualCameraManager,
     private val camera2CameraControllerComponent: Camera2ControllerComponent.Builder,
+    private val camera2CameraStatusMonitor: Camera2CameraStatusMonitor,
 ) : CameraBackend {
     override val id: CameraBackendId
         get() = CameraBackendId("CXCP-Camera2")
+    override val cameraStatus: Flow<CameraStatus>
+        get() = camera2CameraStatusMonitor.cameraStatus
 
     override suspend fun getCameraIds(): List<CameraId>? = camera2DeviceCache.getCameraIds()
 
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 4b48fbc..5ddaf29 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
@@ -17,16 +17,22 @@
 package androidx.camera.camera2.pipe.compat
 
 import android.view.Surface
+import androidx.annotation.GuardedBy
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraController
+import androidx.camera.camera2.pipe.CameraController.ControllerState
+import androidx.camera.camera2.pipe.CameraError
 import androidx.camera.camera2.pipe.CameraGraph
+import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraSurfaceManager
 import androidx.camera.camera2.pipe.StreamId
 import androidx.camera.camera2.pipe.config.Camera2ControllerScope
+import androidx.camera.camera2.pipe.core.Log
 import androidx.camera.camera2.pipe.core.TimeSource
 import androidx.camera.camera2.pipe.graph.GraphListener
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 
 /**
@@ -52,79 +58,104 @@
     private val cameraSurfaceManager: CameraSurfaceManager,
     private val timeSource: TimeSource
 ) : CameraController {
-    private var closed = false
+    override val cameraId: CameraId
+        get() = config.camera
+
+    private val lock = Any()
+
+    @GuardedBy("lock")
+    private var controllerState: ControllerState = ControllerState.STOPPED
+
     private var currentCamera: VirtualCamera? = null
     private var currentSession: CaptureSessionState? = null
     private var currentSurfaceMap: Map<StreamId, Surface>? = null
 
-    override fun start() {
-        val camera =
-            virtualCameraManager.open(
-                config.camera, config.flags.allowMultipleActiveCameras, graphListener
-            )
-        synchronized(this) {
-            if (closed) {
-                return
-            }
+    private var currentCameraStateJob: Job? = null
 
-            check(currentCamera == null)
-            check(currentSession == null)
-
-            currentCamera = camera
-            val session =
-                CaptureSessionState(
-                    graphListener,
-                    captureSessionFactory,
-                    captureSequenceProcessorFactory,
-                    cameraSurfaceManager,
-                    timeSource,
-                    scope
-                )
-            currentSession = session
-
-            val surfaces: Map<StreamId, Surface>? = currentSurfaceMap
-            if (surfaces != null) {
-                session.configureSurfaceMap(surfaces)
-            }
+    override fun start(): Unit = synchronized(lock) {
+        if (controllerState == ControllerState.CLOSED) {
+            Log.info { "Ignoring start(): Camera2CameraController is already closed" }
+            return
+        } else if (controllerState == ControllerState.STARTED) {
+            Log.warn { "Ignoring start(): Camera2CameraController is already started" }
+            return
         }
-        scope.launch { bindSessionToCamera() }
+        val camera = virtualCameraManager.open(
+            config.camera,
+            config.flags.allowMultipleActiveCameras,
+            graphListener
+        )
+
+        check(currentCamera == null)
+        check(currentSession == null)
+
+        currentCamera = camera
+        val session = CaptureSessionState(
+            graphListener,
+            captureSessionFactory,
+            captureSequenceProcessorFactory,
+            cameraSurfaceManager,
+            timeSource,
+            scope
+        )
+        currentSession = session
+
+        val surfaces: Map<StreamId, Surface>? = currentSurfaceMap
+        if (surfaces != null) {
+            session.configureSurfaceMap(surfaces)
+        }
+
+        controllerState = ControllerState.STARTED
+        Log.debug { "Started Camera2CameraController" }
+        currentCameraStateJob = scope.launch { bindSessionToCamera() }
     }
 
-    override fun stop() {
-        val camera: VirtualCamera?
-        val session: CaptureSessionState?
-        synchronized(this) {
-            if (closed) {
-                return
-            }
-
-            camera = currentCamera
-            session = currentSession
-
-            currentCamera = null
-            currentSession = null
+    override fun stop(): Unit = synchronized(lock) {
+        if (controllerState == ControllerState.CLOSED) {
+            Log.warn { "Ignoring stop(): Camera2CameraController is already closed" }
+            return
+        } else if (controllerState == ControllerState.STOPPING ||
+            controllerState == ControllerState.STOPPED
+        ) {
+            Log.warn { "Ignoring stop(): CameraController already stopping or stopped" }
+            return
         }
 
+        val camera = currentCamera
+        val session = currentSession
+
+        currentCamera = null
+        currentSession = null
+
+        controllerState = ControllerState.STOPPING
+        Log.debug { "Stopping Camera2CameraController" }
         scope.launch {
             session?.disconnect()
             camera?.disconnect()
         }
     }
 
-    override fun close() {
-        val camera: VirtualCamera?
-        val session: CaptureSessionState?
-        synchronized(this) {
-            if (closed) {
-                return
-            }
-            closed = true
-            camera = currentCamera
-            session = currentSession
-
-            currentCamera = null
-            currentSession = null
+    override fun tryRestart(): Unit = synchronized(lock) {
+        if (controllerState != ControllerState.DISCONNECTED) {
+            Log.debug { "Ignoring restart(): CameraController is $controllerState" }
+            return
         }
+        stop()
+        start()
+    }
+
+    override fun close(): Unit = synchronized(lock) {
+        if (controllerState == ControllerState.CLOSED) {
+            return
+        }
+        controllerState = ControllerState.CLOSED
+        Log.debug { "Closed Camera2CameraController" }
+
+        val camera = currentCamera
+        val session = currentSession
+
+        currentCamera = null
+        currentSession = null
 
         scope.launch {
             session?.disconnect()
@@ -134,33 +165,67 @@
 
     override fun updateSurfaceMap(surfaceMap: Map<StreamId, Surface>) {
         // TODO: Add logic to decide if / when to re-configure the Camera2 CaptureSession.
-        synchronized(this) {
-            if (closed) {
+        synchronized(lock) {
+            if (controllerState == ControllerState.CLOSED) {
                 return
             }
             currentSurfaceMap = surfaceMap
             currentSession
-        }
-            ?.configureSurfaceMap(surfaceMap)
+        }?.configureSurfaceMap(surfaceMap)
     }
 
     private suspend fun bindSessionToCamera() {
         val camera: VirtualCamera?
         val session: CaptureSessionState?
 
-        synchronized(this) {
+        synchronized(lock) {
             camera = currentCamera
             session = currentSession
         }
 
         if (camera != null && session != null) {
-            camera.state.collect {
-                if (it is CameraStateOpen) {
-                    session.cameraDevice = it.cameraDevice
-                } else if (it is CameraStateClosing || it is CameraStateClosed) {
-                    session.disconnect()
+            camera.state.collect { cameraState ->
+                when (cameraState) {
+                    is CameraStateOpen -> {
+                        session.cameraDevice = cameraState.cameraDevice
+                    }
+
+                    is CameraStateClosing -> {
+                        session.disconnect()
+                    }
+
+                    is CameraStateClosed -> {
+                        session.disconnect()
+                        onStateClosed(cameraState)
+                    }
+
+                    else -> {
+                        // Do nothing
+                    }
                 }
             }
         }
     }
+
+    private fun onStateClosed(cameraState: CameraStateClosed) = synchronized(lock) {
+        if (cameraState.cameraErrorCode != null) {
+            if (cameraState.cameraErrorCode == CameraError.ERROR_CAMERA_DISCONNECTED ||
+                cameraState.cameraErrorCode == CameraError.ERROR_CAMERA_IN_USE ||
+                cameraState.cameraErrorCode == CameraError.ERROR_CAMERA_LIMIT_EXCEEDED
+            ) {
+                controllerState = ControllerState.DISCONNECTED
+                Log.debug { "Camera2CameraController is disconnected" }
+            } else {
+                controllerState = ControllerState.ERROR
+                Log.debug {
+                    "Camera2CameraController encountered an " +
+                        "unrecoverable error: ${cameraState.cameraErrorCode}"
+                }
+            }
+        } else {
+            controllerState = ControllerState.STOPPED
+        }
+        currentCameraStateJob?.cancel()
+        currentCameraStateJob = null
+    }
 }
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 d533838..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
@@ -172,9 +172,11 @@
             } 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()
                     }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraStatusMonitor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraStatusMonitor.kt
new file mode 100644
index 0000000..0ab7e59
--- /dev/null
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraStatusMonitor.kt
@@ -0,0 +1,73 @@
+/*
+ * 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.camera.camera2.pipe.compat
+
+import android.hardware.camera2.CameraManager
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.CameraStatusMonitor
+import androidx.camera.camera2.pipe.CameraStatusMonitor.CameraStatus
+import androidx.camera.camera2.pipe.core.Log
+import androidx.camera.camera2.pipe.core.Threads
+import javax.inject.Inject
+import javax.inject.Provider
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.channels.onFailure
+import kotlinx.coroutines.channels.trySendBlocking
+import kotlinx.coroutines.flow.callbackFlow
+
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+internal class Camera2CameraStatusMonitor @Inject constructor(
+    cameraManager: Provider<CameraManager>,
+    threads: Threads
+) : CameraStatusMonitor {
+    override val cameraStatus = callbackFlow {
+        val manager = cameraManager.get()
+        val availabilityCallback = object : CameraManager.AvailabilityCallback() {
+            override fun onCameraAccessPrioritiesChanged() {
+                Log.debug { "Camera access priorities have changed" }
+                trySendBlocking(CameraStatus.CameraPrioritiesChanged)
+                    .onFailure {
+                        Log.warn { "Failed to emit CameraPrioritiesChanged" }
+                    }
+            }
+
+            override fun onCameraAvailable(cameraId: String) {
+                Log.debug { "Camera $cameraId has become available" }
+                trySendBlocking(CameraStatus.CameraAvailable(CameraId.fromCamera2Id(cameraId)))
+                    .onFailure {
+                        Log.warn { "Failed to emit CameraAvailable($cameraId)" }
+                    }
+            }
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            Api28Compat.registerAvailabilityCallback(
+                manager,
+                threads.lightweightExecutor,
+                availabilityCallback
+            )
+        } else {
+            manager.registerAvailabilityCallback(
+                availabilityCallback,
+                threads.camera2Handler
+            )
+        }
+
+        awaitClose { manager.unregisterAvailabilityCallback(availabilityCallback) }
+    }
+}
\ No newline at end of file
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 bee2f49..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
@@ -42,7 +42,7 @@
     @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
@@ -79,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 aa1a8e40..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
@@ -89,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)
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 564a5bc..2698852 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
@@ -18,6 +18,8 @@
 
 package androidx.camera.camera2.pipe.compat
 
+import android.hardware.camera2.CameraAccessException
+import android.hardware.camera2.CameraAccessException.CAMERA_ERROR
 import android.hardware.camera2.CameraCaptureSession
 import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession
 import android.hardware.camera2.CaptureRequest
@@ -354,10 +356,23 @@
                 "succeed."
         }
 
-        rethrowCamera2Exceptions {
+        var exceptionToThrow: Throwable? = null
+        try {
             Api26Compat.finalizeOutputConfigurations(
-                cameraCaptureSession, outputConfigs.map { it.unwrapAs(OutputConfiguration::class) })
+                cameraCaptureSession,
+                outputConfigs.map { it.unwrapAs(OutputConfiguration::class) })
+        } catch (e: CameraAccessException) {
+            // TODO(b/266734799): There is a possibility that we might finalize output
+            //  configurations on a camera that's been disconnected. In such cases, we'll receive
+            //  CameraAccessException.CAMERA_ERROR. Catch it for now, until we properly report and
+            //  handle capture session errors.
+            if (e.reason != CAMERA_ERROR) {
+                exceptionToThrow = e
+            }
+        } catch (e: Throwable) {
+            exceptionToThrow = e
         }
+        exceptionToThrow?.let { rethrowCamera2Exceptions { throw it } }
     }
 
     @Suppress("UNCHECKED_CAST")
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 8988b2b..151d702 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
@@ -50,6 +50,9 @@
         GraphRequestProcessor.from(sequenceProcessor)
     private var started = atomic(false)
 
+    override val cameraId: CameraId
+        get() = graphConfig.camera
+
     override fun start() {
         if (started.compareAndSet(expect = false, update = true)) {
             graphListener.onGraphStarted(graphProcessor)
@@ -62,6 +65,11 @@
         }
     }
 
+    override fun tryRestart() {
+        // This is intentionally made a no-op for now as CameraPipe external doesn't support
+        // camera status monitoring and camera controller restart.
+    }
+
     override fun close() {
         graphProcessor.close()
     }
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 b870809..fe27798 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
@@ -21,6 +21,7 @@
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraError
 import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.core.Log
 import androidx.camera.camera2.pipe.core.Permissions
 import androidx.camera.camera2.pipe.core.Threads
 import androidx.camera.camera2.pipe.core.WakeLock
@@ -206,6 +207,7 @@
         //   causing the application process to restart.
         check(permissions.hasCameraPermission) { "Missing camera permissions!" }
 
+        Log.debug { "Opening $cameraId with retries..." }
         val result = retryingCameraStateOpener.openCameraWithRetry(cameraId, graphListener)
         if (result.cameraState == null) {
             return OpenVirtualCameraResult(lastCameraError = result.errorCode)
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 c7b6b1e..57d38e5 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
@@ -20,11 +20,13 @@
 import androidx.camera.camera2.pipe.CameraBackend
 import androidx.camera.camera2.pipe.CameraController
 import androidx.camera.camera2.pipe.CameraGraph
+import androidx.camera.camera2.pipe.CameraStatusMonitor
 import androidx.camera.camera2.pipe.StreamGraph
 import androidx.camera.camera2.pipe.compat.Camera2Backend
 import androidx.camera.camera2.pipe.compat.Camera2CameraAvailabilityMonitor
 import androidx.camera.camera2.pipe.compat.Camera2CameraController
 import androidx.camera.camera2.pipe.compat.Camera2CameraOpener
+import androidx.camera.camera2.pipe.compat.Camera2CameraStatusMonitor
 import androidx.camera.camera2.pipe.compat.Camera2CaptureSequenceProcessorFactory
 import androidx.camera.camera2.pipe.compat.Camera2CaptureSessionsModule
 import androidx.camera.camera2.pipe.compat.Camera2MetadataCache
@@ -62,6 +64,11 @@
     abstract fun bindCameraAvailabilityMonitor(
         camera2CameraAvailabilityMonitor: Camera2CameraAvailabilityMonitor
     ): CameraAvailabilityMonitor
+
+    @Binds
+    abstract fun bindCameraStatusMonitor(
+        camera2CameraStatusMonitor: Camera2CameraStatusMonitor
+    ): CameraStatusMonitor
 }
 
 @Scope
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 a68ff48..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
@@ -138,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
         }
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 ce3a3ad..28bd09a 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
@@ -55,6 +55,9 @@
 @Qualifier
 internal annotation class CameraPipeContext
 
+@Qualifier
+internal annotation class ForGraphLifecycleManager
+
 @Singleton
 @Component(
     modules =
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 b93b659..6ca0561 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
@@ -21,15 +21,24 @@
 package androidx.camera.camera2.pipe.config
 
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.CameraBackend
+import androidx.camera.camera2.pipe.CameraBackendId
+import androidx.camera.camera2.pipe.CameraContext
 import androidx.camera.camera2.pipe.CameraController
 import androidx.camera.camera2.pipe.CameraGraph
+import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
+import androidx.camera.camera2.pipe.CameraStatusMonitor
 import androidx.camera.camera2.pipe.RequestProcessor
+import androidx.camera.camera2.pipe.StreamGraph
 import androidx.camera.camera2.pipe.compat.ExternalCameraController
 import androidx.camera.camera2.pipe.graph.GraphListener
 import dagger.Module
 import dagger.Provides
 import dagger.Subcomponent
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
 
 @CameraGraphScope
 @Subcomponent(modules = [SharedCameraGraphModules::class, ExternalCameraGraphConfigModule::class])
@@ -49,6 +58,45 @@
     private val cameraMetadata: CameraMetadata,
     private val requestProcessor: RequestProcessor
 ) {
+    private val externalCameraBackend = object : CameraBackend {
+        override val id: CameraBackendId
+            get() = CameraBackendId("External")
+        override val cameraStatus: Flow<CameraStatusMonitor.CameraStatus>
+            get() = MutableSharedFlow()
+
+        override suspend fun getCameraIds(): List<CameraId>? {
+            throwUnsupportedOperationException()
+        }
+
+        override fun awaitCameraIds(): List<CameraId>? {
+            throwUnsupportedOperationException()
+        }
+
+        override fun awaitCameraMetadata(cameraId: CameraId): CameraMetadata? {
+            throwUnsupportedOperationException()
+        }
+
+        override fun disconnectAllAsync(): Deferred<Unit> {
+            throwUnsupportedOperationException()
+        }
+
+        override fun shutdownAsync(): Deferred<Unit> {
+            throwUnsupportedOperationException()
+        }
+
+        override fun createCameraController(
+            cameraContext: CameraContext,
+            graphConfig: CameraGraph.Config,
+            graphListener: GraphListener,
+            streamGraph: StreamGraph
+        ): CameraController {
+            throwUnsupportedOperationException()
+        }
+
+        private fun throwUnsupportedOperationException(): Nothing =
+            throw UnsupportedOperationException("External CameraPipe should not use backends")
+    }
+
     @Provides
     fun provideCameraGraphConfig(): CameraGraph.Config = config
 
@@ -59,4 +107,8 @@
     @Provides
     fun provideGraphController(graphListener: GraphListener): CameraController =
         ExternalCameraController(config, graphListener, requestProcessor)
+
+    @CameraGraphScope
+    @Provides
+    fun provideCameraBackend(): CameraBackend = externalCameraBackend
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
index 233200c..6068c13 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
@@ -25,4 +25,4 @@
 @Component(modules = [ThreadConfigModule::class])
 internal interface ExternalCameraPipeComponent {
     fun cameraGraphBuilder(): ExternalCameraGraphComponent.Builder
-}
+}
\ No newline at end of file
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 83c29d1..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
@@ -52,7 +52,7 @@
             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 bebd791..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
@@ -162,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/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/graph/CameraGraphImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
index 366f78c..586f399 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
@@ -18,6 +18,7 @@
 
 import android.view.Surface
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.CameraBackend
 import androidx.camera.camera2.pipe.CameraController
 import androidx.camera.camera2.pipe.CameraGraph
 import androidx.camera.camera2.pipe.CameraMetadata
@@ -31,6 +32,7 @@
 import androidx.camera.camera2.pipe.core.TokenLockImpl
 import androidx.camera.camera2.pipe.core.acquire
 import androidx.camera.camera2.pipe.core.acquireOrNull
+import androidx.camera.camera2.pipe.internal.GraphLifecycleManager
 import javax.inject.Inject
 import kotlinx.atomicfu.atomic
 import kotlinx.coroutines.flow.StateFlow
@@ -44,10 +46,12 @@
 constructor(
     graphConfig: CameraGraph.Config,
     metadata: CameraMetadata,
+    private val graphLifecycleManager: GraphLifecycleManager,
     private val graphProcessor: GraphProcessor,
     private val graphListener: GraphListener,
     private val streamGraph: StreamGraphImpl,
     private val surfaceGraph: SurfaceGraph,
+    private val cameraBackend: CameraBackend,
     private val cameraController: CameraController,
     private val graphState3A: GraphState3A,
     private val listener3A: Listener3A
@@ -104,7 +108,7 @@
         Debug.traceStart { "$this#start" }
         Log.info { "Starting $this" }
         graphListener.onGraphStarting()
-        cameraController.start()
+        graphLifecycleManager.monitorAndStart(cameraBackend, cameraController)
         Debug.traceStop()
     }
 
@@ -112,7 +116,7 @@
         Debug.traceStart { "$this#stop" }
         Log.info { "Stopping $this" }
         graphListener.onGraphStopping()
-        cameraController.stop()
+        graphLifecycleManager.monitorAndStop(cameraBackend, cameraController)
         Debug.traceStop()
     }
 
@@ -146,7 +150,7 @@
         Log.info { "Closing $this" }
         sessionLock.close()
         graphProcessor.close()
-        cameraController.close()
+        graphLifecycleManager.monitorAndClose(cameraBackend, cameraController)
         surfaceGraph.close()
         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 9bde838..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>>
 ) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/GraphLifecycleManager.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/GraphLifecycleManager.kt
new file mode 100644
index 0000000..1429f76
--- /dev/null
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/GraphLifecycleManager.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.camera.camera2.pipe.internal
+
+import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.CameraBackend
+import androidx.camera.camera2.pipe.CameraBackendId
+import androidx.camera.camera2.pipe.CameraController
+import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.CameraStatusMonitor
+import androidx.camera.camera2.pipe.CameraStatusMonitor.CameraStatus
+import androidx.camera.camera2.pipe.core.Threads
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+
+/**
+ * GraphLifecycleManager is a CameraPipe-level lifecycle manager that does the following:
+ * - Oversees and executes the operations of [CameraController]`s. This means it will make sure the
+ *   operations are atomic, and executed based on permissible state transitions.
+ * - Subscribe to [CameraStatusMonitor]s for camera status changes, basically “can attempt to
+ *   restart signals”, from the respective camera backends, and then only restart
+ *   [CameraController]s when the conditions are right.
+ * - Once we've determined that we can restart [CameraController]s, select the “suitable”
+ *   [CameraController] to restart.
+ */
+@Singleton
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+internal class GraphLifecycleManager @Inject constructor(val threads: Threads) {
+    private val lock = Any()
+
+    private val scope = CoroutineScope(
+        threads.lightweightDispatcher.plus(CoroutineName("CXCP-GraphLifecycleManager"))
+    )
+
+    @GuardedBy("lock")
+    private val backendControllerMap =
+        mutableMapOf<CameraBackendId, LinkedHashSet<CameraController>>()
+
+    @GuardedBy("lock")
+    private val backendStatusCollectJobMap = mutableMapOf<CameraBackendId, Job>()
+
+    internal fun monitorAndStart(cameraBackend: CameraBackend, cameraController: CameraController) =
+        synchronized(lock) {
+            startMonitoring(cameraBackend, cameraController)
+            cameraController.start()
+        }
+
+    internal fun monitorAndStop(cameraBackend: CameraBackend, cameraController: CameraController) =
+        synchronized(lock) {
+            cameraController.stop()
+            stopMonitoring(cameraBackend, cameraController)
+        }
+
+    internal fun monitorAndClose(cameraBackend: CameraBackend, cameraController: CameraController) =
+        synchronized(lock) {
+            cameraController.close()
+            stopMonitoring(cameraBackend, cameraController)
+        }
+
+    @GuardedBy("lock")
+    private fun startMonitoring(cameraBackend: CameraBackend, cameraController: CameraController) {
+        if (backendControllerMap.containsKey(cameraBackend.id)) {
+            backendControllerMap[cameraBackend.id]?.add(cameraController)
+            return
+        }
+        backendControllerMap[cameraBackend.id] = linkedSetOf(cameraController)
+        backendStatusCollectJobMap[cameraBackend.id] = scope.launch {
+            cameraBackend.cameraStatus.collect { cameraStatus ->
+                when (cameraStatus) {
+                    is CameraStatus.CameraPrioritiesChanged ->
+                        tryRestartCameraController(cameraBackend)
+
+                    is CameraStatus.CameraAvailable ->
+                        tryRestartCameraController(cameraBackend, cameraStatus.cameraId)
+                }
+            }
+        }
+    }
+
+    @GuardedBy("lock")
+    private fun stopMonitoring(cameraBackend: CameraBackend, cameraController: CameraController) {
+        if (backendControllerMap.containsKey(cameraBackend.id)) {
+            val controllerSet = backendControllerMap[cameraBackend.id]
+            controllerSet?.remove(cameraController)
+            if (controllerSet?.size == 0) {
+                backendControllerMap.remove(cameraBackend.id)
+                backendStatusCollectJobMap[cameraBackend.id]?.cancel()
+                backendStatusCollectJobMap.remove(cameraBackend.id)
+            }
+        }
+    }
+
+    private fun tryRestartCameraController(
+        cameraBackend: CameraBackend,
+        cameraId: CameraId? = null,
+    ) = synchronized(lock) {
+        // Restart the last CameraController being tracked in each backend. The last
+        // CameraController would be the latest one being tracked, and should thus take priority
+        // over previous CameraControllers.
+        backendControllerMap[cameraBackend.id]?.findLast {
+            if (cameraId != null) {
+                it.cameraId == cameraId
+            } else {
+                true
+            }
+        }?.tryRestart()
+    }
+}
\ No newline at end of file
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 e377214..05af92f 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
@@ -30,6 +30,7 @@
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.StreamFormat
 import androidx.camera.camera2.pipe.internal.CameraBackendsImpl
+import androidx.camera.camera2.pipe.internal.GraphLifecycleManager
 import androidx.camera.camera2.pipe.testing.CameraControllerSimulator
 import androidx.camera.camera2.pipe.testing.FakeCameraBackend
 import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
@@ -92,6 +93,7 @@
                 threads
             )
         val cameraContext = CameraBackendsImpl.CameraBackendContext(context, threads, backends)
+        val graphLifecycleManager = GraphLifecycleManager(threads)
         val streamGraph = StreamGraphImpl(metadata, graphConfig)
         cameraController =
             CameraControllerSimulator(cameraContext, graphConfig, fakeGraphProcessor, streamGraph)
@@ -101,10 +103,12 @@
             CameraGraphImpl(
                 graphConfig,
                 metadata,
+                graphLifecycleManager,
                 fakeGraphProcessor,
                 fakeGraphProcessor,
                 streamGraph,
                 surfaceGraph,
+                backend,
                 cameraController,
                 GraphState3A(),
                 Listener3A()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraController.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraController.kt
index b637133..c49f98a 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraController.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraController.kt
@@ -18,12 +18,15 @@
 
 import android.view.Surface
 import androidx.camera.camera2.pipe.CameraController
+import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.StreamId
 
 internal class FakeCameraController : CameraController {
     var started = false
     var closed = false
     var surfaceMap: Map<StreamId, Surface>? = null
+    override val cameraId: CameraId
+        get() = CameraId.fromCamera2Id("0")
 
     override fun start() {
         started = true
@@ -33,6 +36,11 @@
         started = false
     }
 
+    override fun tryRestart() {
+        stop()
+        start()
+    }
+
     override fun close() {
         closed = true
         started = false
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt
deleted file mode 100644
index 6d48e3e7..0000000
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.camera2.internal
-
-import android.hardware.camera2.CameraCharacteristics
-import android.media.CamcorderProfile
-import android.util.Size
-import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat
-import androidx.camera.camera2.internal.compat.StreamConfigurationMapCompat
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.impl.ImageFormatConstants
-import androidx.camera.testing.CameraUtil
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume.assumeTrue
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-@RunWith(Parameterized::class)
-@SmallTest
-@Suppress("DEPRECATION")
-@SdkSuppress(minSdkVersion = 21)
-public class Camera2CamcorderProfileProviderTest(private val quality: Int) {
-    public companion object {
-        @JvmStatic
-        @Parameterized.Parameters
-        public fun data(): Array<Array<Int>> = arrayOf(
-            arrayOf(CamcorderProfile.QUALITY_LOW),
-            arrayOf(CamcorderProfile.QUALITY_HIGH),
-            arrayOf(CamcorderProfile.QUALITY_QCIF),
-            arrayOf(CamcorderProfile.QUALITY_CIF),
-            arrayOf(CamcorderProfile.QUALITY_480P),
-            arrayOf(CamcorderProfile.QUALITY_720P),
-            arrayOf(CamcorderProfile.QUALITY_1080P),
-            arrayOf(CamcorderProfile.QUALITY_QVGA),
-            arrayOf(CamcorderProfile.QUALITY_2160P),
-            arrayOf(CamcorderProfile.QUALITY_VGA),
-            arrayOf(CamcorderProfile.QUALITY_4KDCI),
-            arrayOf(CamcorderProfile.QUALITY_QHD),
-            arrayOf(CamcorderProfile.QUALITY_2K)
-        )
-    }
-
-    private lateinit var camcorderProfileProvider: Camera2CamcorderProfileProvider
-    private lateinit var cameraCharacteristics: CameraCharacteristicsCompat
-    private var isLegacyCamera = false
-    private var intCameraId = -1
-
-    @Before
-    public fun setup() {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
-
-        val cameraId = CameraUtil.getCameraIdWithLensFacing(CameraSelector.LENS_FACING_BACK)!!
-        intCameraId = cameraId.toInt()
-
-        cameraCharacteristics = CameraCharacteristicsCompat.toCameraCharacteristicsCompat(
-            CameraUtil.getCameraCharacteristics(CameraSelector.LENS_FACING_BACK)!!
-        )
-        val hardwareLevel =
-            cameraCharacteristics[CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL]
-
-        isLegacyCamera = hardwareLevel != null && hardwareLevel == CameraCharacteristics
-            .INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
-
-        camcorderProfileProvider = Camera2CamcorderProfileProvider(cameraId, cameraCharacteristics)
-    }
-
-    @Test
-    public fun nonLegacyCamera_hasProfile_returnSameResult() {
-        assumeTrue(!isLegacyCamera)
-
-        assertThat(camcorderProfileProvider.hasProfile(quality))
-            .isEqualTo(CamcorderProfile.hasProfile(intCameraId, quality))
-    }
-
-    @Test
-    public fun nonLegacyCamera_notHasProfile_getReturnNull() {
-        assumeTrue(!isLegacyCamera)
-        assumeTrue(!CamcorderProfile.hasProfile(intCameraId, quality))
-
-        assertThat(camcorderProfileProvider.get(quality)).isNull()
-    }
-
-    @Test
-    public fun nonLegacyCamera_hasProfile_getReturnSameQualityProfile() {
-        assumeTrue(!isLegacyCamera)
-        assumeTrue(CamcorderProfile.hasProfile(intCameraId, quality))
-
-        val profileProxy = camcorderProfileProvider.get(quality)!!
-        val profile = CamcorderProfile.get(intCameraId, quality)
-        assertThat(profileProxy.quality).isEqualTo(profile.quality)
-    }
-
-    @Test
-    public fun legacyCamera_notHasProfile_returnFalse() {
-        assumeTrue(isLegacyCamera)
-        assumeTrue(!CamcorderProfile.hasProfile(intCameraId, quality))
-
-        assertThat(camcorderProfileProvider.hasProfile(quality)).isFalse()
-    }
-
-    @Test
-    public fun legacyCamera_hasProfile_shouldCheckSupportedResolution() {
-        assumeTrue(isLegacyCamera)
-        assumeTrue(CamcorderProfile.hasProfile(intCameraId, quality))
-
-        val videoSupportedResolutions = getVideoSupportedResolutions()
-        val isResolutionSupported =
-            videoSupportedResolutions.contains(CamcorderProfile.get(intCameraId, quality).size())
-
-        assertThat(camcorderProfileProvider.hasProfile(quality)).isEqualTo(isResolutionSupported)
-    }
-
-    @Test
-    public fun legacyCamera_notHasProfile_getReturnNull() {
-        assumeTrue(isLegacyCamera)
-        assumeTrue(!CamcorderProfile.hasProfile(intCameraId, quality))
-
-        assertThat(camcorderProfileProvider.get(quality)).isNull()
-    }
-
-    @Test
-    public fun legacyCamera_hasProfile_getShouldCheckSupportedResolution() {
-        assumeTrue(isLegacyCamera)
-        assumeTrue(CamcorderProfile.hasProfile(intCameraId, quality))
-
-        val profile = CamcorderProfile.get(intCameraId, quality)
-        val videoSupportedResolutions = getVideoSupportedResolutions()
-        val isResolutionSupported = videoSupportedResolutions.contains(profile.size())
-
-        val profileProxy = camcorderProfileProvider.get(quality)
-        if (isResolutionSupported) {
-            assertThat(profileProxy!!.quality).isEqualTo(profile.quality)
-        } else {
-            assertThat(profileProxy).isNull()
-        }
-    }
-
-    private fun getVideoSupportedResolutions(): Array<Size> {
-        val mapCompat = StreamConfigurationMapCompat.toStreamConfigurationMapCompat(
-            cameraCharacteristics[CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP]!!
-        )
-        return mapCompat.getOutputSizes(ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE)
-            ?: emptyArray()
-    }
-
-    private fun CamcorderProfile.size() = Size(videoFrameWidth, videoFrameHeight)
-}
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/Camera2EncoderProfilesProviderTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2EncoderProfilesProviderTest.kt
new file mode 100644
index 0000000..4376357
--- /dev/null
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2EncoderProfilesProviderTest.kt
@@ -0,0 +1,199 @@
+/*
+ * 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
+
+import android.media.CamcorderProfile
+import android.media.EncoderProfiles.VideoProfile.HDR_NONE
+import android.media.EncoderProfiles.VideoProfile.YUV_420
+import android.os.Build
+import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks
+import androidx.camera.camera2.internal.compat.quirk.InvalidVideoProfilesQuirk
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy.BIT_DEPTH_8
+import androidx.camera.testing.CameraUtil
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assume.assumeFalse
+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
+
+@RunWith(Parameterized::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class Camera2EncoderProfilesProviderTest(private val quality: Int) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters
+        fun data(): Array<Array<Int>> = arrayOf(
+            arrayOf(CamcorderProfile.QUALITY_LOW),
+            arrayOf(CamcorderProfile.QUALITY_HIGH),
+            arrayOf(CamcorderProfile.QUALITY_QCIF),
+            arrayOf(CamcorderProfile.QUALITY_CIF),
+            arrayOf(CamcorderProfile.QUALITY_480P),
+            arrayOf(CamcorderProfile.QUALITY_720P),
+            arrayOf(CamcorderProfile.QUALITY_1080P),
+            arrayOf(CamcorderProfile.QUALITY_QVGA),
+            arrayOf(CamcorderProfile.QUALITY_2160P),
+            arrayOf(CamcorderProfile.QUALITY_VGA),
+            arrayOf(CamcorderProfile.QUALITY_4KDCI),
+            arrayOf(CamcorderProfile.QUALITY_QHD),
+            arrayOf(CamcorderProfile.QUALITY_2K)
+        )
+    }
+
+    private lateinit var encoderProfilesProvider: Camera2EncoderProfilesProvider
+    private var cameraId = ""
+    private var intCameraId = -1
+
+    @get:Rule
+    val useCamera = CameraUtil.grantCameraPermissionAndPreTest()
+
+    @Before
+    fun setup() {
+        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+
+        cameraId = CameraUtil.getCameraIdWithLensFacing(CameraSelector.LENS_FACING_BACK)!!
+        intCameraId = cameraId.toInt()
+
+        encoderProfilesProvider = Camera2EncoderProfilesProvider(cameraId)
+    }
+
+    @Test
+    fun hasProfile_returnSameResult() {
+        assertThat(encoderProfilesProvider.hasProfile(quality))
+            .isEqualTo(CamcorderProfile.hasProfile(intCameraId, quality))
+    }
+
+    @Test
+    fun hasProfile_getReturnNonNull() {
+        assumeTrue(CamcorderProfile.hasProfile(intCameraId, quality))
+
+        assertThat(encoderProfilesProvider.getAll(quality)).isNotNull()
+    }
+
+    @Test
+    fun notHasProfile_getReturnNull() {
+        assumeTrue(!CamcorderProfile.hasProfile(intCameraId, quality))
+
+        assertThat(encoderProfilesProvider.getAll(quality)).isNull()
+    }
+
+    @Suppress("DEPRECATION")
+    @Test
+    fun hasSameContentAsCamcorderProfile() {
+        assumeTrue(CamcorderProfile.hasProfile(quality))
+
+        val profile = CamcorderProfile.get(quality)
+        val encoderProfiles = encoderProfilesProvider.getAll(quality)
+        val videoProfile = encoderProfiles!!.videoProfiles[0]
+        val audioProfile = encoderProfiles.audioProfiles[0]
+
+        assertThat(encoderProfiles.defaultDurationSeconds).isEqualTo(profile.duration)
+        assertThat(encoderProfiles.recommendedFileFormat).isEqualTo(profile.fileFormat)
+        assertThat(videoProfile.codec).isEqualTo(profile.videoCodec)
+        assertThat(videoProfile.bitrate).isEqualTo(profile.videoBitRate)
+        assertThat(videoProfile.frameRate).isEqualTo(profile.videoFrameRate)
+        assertThat(videoProfile.width).isEqualTo(profile.videoFrameWidth)
+        assertThat(videoProfile.height).isEqualTo(profile.videoFrameHeight)
+        assertThat(audioProfile.codec).isEqualTo(profile.audioCodec)
+        assertThat(audioProfile.bitrate).isEqualTo(profile.audioBitRate)
+        assertThat(audioProfile.sampleRate).isEqualTo(profile.audioSampleRate)
+        assertThat(audioProfile.channels).isEqualTo(profile.audioChannels)
+    }
+
+    @SdkSuppress(minSdkVersion = 31, maxSdkVersion = 32)
+    @Test
+    fun api31Api32_hasSameContentAsEncoderProfiles() {
+        assumeTrue(CamcorderProfile.hasProfile(quality))
+
+        val profiles = CamcorderProfile.getAll(cameraId, quality)
+        val video = profiles!!.videoProfiles[0]
+        val audio = profiles.audioProfiles[0]
+        val profilesProxy = encoderProfilesProvider.getAll(quality)
+        val videoProxy = profilesProxy!!.videoProfiles[0]
+        val audioProxy = profilesProxy.audioProfiles[0]
+
+        assertThat(profilesProxy.defaultDurationSeconds).isEqualTo(profiles.defaultDurationSeconds)
+        assertThat(profilesProxy.recommendedFileFormat).isEqualTo(profiles.recommendedFileFormat)
+        assertThat(videoProxy.codec).isEqualTo(video.codec)
+        assertThat(videoProxy.mediaType).isEqualTo(video.mediaType)
+        assertThat(videoProxy.bitrate).isEqualTo(video.bitrate)
+        assertThat(videoProxy.frameRate).isEqualTo(video.frameRate)
+        assertThat(videoProxy.width).isEqualTo(video.width)
+        assertThat(videoProxy.height).isEqualTo(video.height)
+        assertThat(videoProxy.profile).isEqualTo(video.profile)
+        assertThat(videoProxy.bitDepth).isEqualTo(BIT_DEPTH_8)
+        assertThat(videoProxy.chromaSubsampling).isEqualTo(YUV_420)
+        assertThat(videoProxy.hdrFormat).isEqualTo(HDR_NONE)
+        assertThat(audioProxy.codec).isEqualTo(audio.codec)
+        assertThat(audioProxy.mediaType).isEqualTo(audio.mediaType)
+        assertThat(audioProxy.bitrate).isEqualTo(audio.bitrate)
+        assertThat(audioProxy.sampleRate).isEqualTo(audio.sampleRate)
+        assertThat(audioProxy.channels).isEqualTo(audio.channels)
+        assertThat(audioProxy.profile).isEqualTo(audio.profile)
+    }
+
+    @SdkSuppress(minSdkVersion = 33)
+    @Test
+    fun afterApi33_hasSameContentAsEncoderProfiles() {
+        assumeTrue(CamcorderProfile.hasProfile(quality))
+        skipTestOnDevicesWithProblematicBuild()
+
+        val profiles = CamcorderProfile.getAll(cameraId, quality)
+        val video = profiles!!.videoProfiles[0]
+        val audio = profiles.audioProfiles[0]
+        val profilesProxy = encoderProfilesProvider.getAll(quality)
+        val videoProxy = profilesProxy!!.videoProfiles[0]
+        val audioProxy = profilesProxy.audioProfiles[0]
+
+        assertThat(profilesProxy.defaultDurationSeconds).isEqualTo(profiles.defaultDurationSeconds)
+        assertThat(profilesProxy.recommendedFileFormat).isEqualTo(profiles.recommendedFileFormat)
+        assertThat(videoProxy.codec).isEqualTo(video.codec)
+        assertThat(videoProxy.mediaType).isEqualTo(video.mediaType)
+        assertThat(videoProxy.bitrate).isEqualTo(video.bitrate)
+        assertThat(videoProxy.frameRate).isEqualTo(video.frameRate)
+        assertThat(videoProxy.width).isEqualTo(video.width)
+        assertThat(videoProxy.height).isEqualTo(video.height)
+        assertThat(videoProxy.profile).isEqualTo(video.profile)
+        assertThat(videoProxy.bitDepth).isEqualTo(video.bitDepth)
+        assertThat(videoProxy.chromaSubsampling).isEqualTo(video.chromaSubsampling)
+        assertThat(videoProxy.hdrFormat).isEqualTo(video.hdrFormat)
+        assertThat(audioProxy.codec).isEqualTo(audio.codec)
+        assertThat(audioProxy.mediaType).isEqualTo(audio.mediaType)
+        assertThat(audioProxy.bitrate).isEqualTo(audio.bitrate)
+        assertThat(audioProxy.sampleRate).isEqualTo(audio.sampleRate)
+        assertThat(audioProxy.channels).isEqualTo(audio.channels)
+        assertThat(audioProxy.profile).isEqualTo(audio.profile)
+    }
+
+    private fun skipTestOnDevicesWithProblematicBuild() {
+        // Skip test for b/265613005 and b/223439995
+        val hasVideoProfilesQuirk = DeviceQuirks.get(InvalidVideoProfilesQuirk::class.java) != null
+        val isProblematicCuttlefishBuild =
+            Build.MODEL.contains("Cuttlefish") && Build.ID.startsWith("TP1A")
+        assumeFalse(
+            "Skip test with null VideoProfile issue. Unable to test.",
+            hasVideoProfilesQuirk || isProblematicCuttlefishBuild
+        )
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java
deleted file mode 100644
index 4ad7dd3..0000000
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.camera2.internal;
-
-import android.media.CamcorderProfile;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
-import androidx.camera.camera2.internal.compat.quirk.CamcorderProfileResolutionQuirk;
-import androidx.camera.camera2.internal.compat.quirk.CameraQuirks;
-import androidx.camera.camera2.internal.compat.workaround.CamcorderProfileResolutionValidator;
-import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProvider;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-
-/** An implementation that provides the {@link CamcorderProfileProxy}. */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class Camera2CamcorderProfileProvider implements CamcorderProfileProvider {
-    private static final String TAG = "Camera2CamcorderProfileProvider";
-
-    private final boolean mHasValidCameraId;
-    private final int mCameraId;
-    private final CamcorderProfileResolutionValidator mCamcorderProfileResolutionValidator;
-
-    public Camera2CamcorderProfileProvider(@NonNull String cameraId,
-            @NonNull CameraCharacteristicsCompat cameraCharacteristics) {
-        boolean hasValidCameraId = false;
-        int intCameraId = -1;
-        try {
-            intCameraId = Integer.parseInt(cameraId);
-            hasValidCameraId = true;
-        } catch (NumberFormatException e) {
-            Logger.w(TAG, "Camera id is not an integer: " + cameraId
-                    + ", unable to create CamcorderProfileProvider");
-        }
-        mHasValidCameraId = hasValidCameraId;
-        mCameraId = intCameraId;
-        CamcorderProfileResolutionQuirk quirk = CameraQuirks.get(cameraId, cameraCharacteristics)
-                .get(CamcorderProfileResolutionQuirk.class);
-        mCamcorderProfileResolutionValidator = new CamcorderProfileResolutionValidator(quirk);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean hasProfile(int quality) {
-        if (!mHasValidCameraId) {
-            return false;
-        }
-
-        if (!CamcorderProfile.hasProfile(mCameraId, quality)) {
-            return false;
-        }
-
-        if (mCamcorderProfileResolutionValidator.hasQuirk()) {
-            // Only get profile when quirk exist for performance concern.
-            CamcorderProfileProxy profile = getProfileInternal(quality);
-            return mCamcorderProfileResolutionValidator.hasValidVideoResolution(profile);
-        }
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    @Nullable
-    public CamcorderProfileProxy get(int quality) {
-        if (!mHasValidCameraId) {
-            return null;
-        }
-
-        if (!CamcorderProfile.hasProfile(mCameraId, quality)) {
-            return null;
-        }
-
-        CamcorderProfileProxy profile = getProfileInternal(quality);
-        if (!mCamcorderProfileResolutionValidator.hasValidVideoResolution(profile)) {
-            return null;
-        }
-        return profile;
-    }
-
-    @Nullable
-    @SuppressWarnings("deprecation")
-    private CamcorderProfileProxy getProfileInternal(int quality) {
-        CamcorderProfile profile = null;
-        try {
-            profile = CamcorderProfile.get(mCameraId, quality);
-        } catch (RuntimeException e) {
-            // CamcorderProfile.get() will throw
-            // - RuntimeException if not able to retrieve camcorder profile params.
-            // - IllegalArgumentException if quality is not valid.
-            Logger.w(TAG, "Unable to get CamcorderProfile by quality: " + quality, e);
-        }
-        return profile != null ? CamcorderProfileProxy.fromCamcorderProfile(profile) : null;
-    }
-}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
index df26798..a79d18b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
@@ -54,9 +54,9 @@
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.Logger;
 import androidx.camera.core.ZoomState;
-import androidx.camera.core.impl.CamcorderProfileProvider;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraInfoInternal;
+import androidx.camera.core.impl.EncoderProfilesProvider;
 import androidx.camera.core.impl.ImageOutputConfig.RotationValue;
 import androidx.camera.core.impl.Quirks;
 import androidx.camera.core.impl.Timebase;
@@ -115,7 +115,7 @@
     @NonNull
     private final Quirks mCameraQuirks;
     @NonNull
-    private final CamcorderProfileProvider mCamera2CamcorderProfileProvider;
+    private final EncoderProfilesProvider mCamera2EncoderProfilesProvider;
     @NonNull
     private final CameraManagerCompat mCameraManager;
 
@@ -131,8 +131,7 @@
         mCameraCharacteristicsCompat = cameraManager.getCameraCharacteristicsCompat(mCameraId);
         mCamera2CameraInfo = new Camera2CameraInfo(this);
         mCameraQuirks = CameraQuirks.get(cameraId, mCameraCharacteristicsCompat);
-        mCamera2CamcorderProfileProvider = new Camera2CamcorderProfileProvider(cameraId,
-                mCameraCharacteristicsCompat);
+        mCamera2EncoderProfilesProvider = new Camera2EncoderProfilesProvider(cameraId);
         mCameraStateLiveData = new RedirectableLiveData<>(
                 CameraState.create(CameraState.Type.CLOSED));
     }
@@ -401,8 +400,8 @@
     /** {@inheritDoc} */
     @NonNull
     @Override
-    public CamcorderProfileProvider getCamcorderProfileProvider() {
-        return mCamera2CamcorderProfileProvider;
+    public EncoderProfilesProvider getEncoderProfilesProvider() {
+        return mCamera2EncoderProfilesProvider;
     }
 
     @NonNull
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2EncoderProfilesProvider.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2EncoderProfilesProvider.java
new file mode 100644
index 0000000..5103731
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2EncoderProfilesProvider.java
@@ -0,0 +1,136 @@
+/*
+ * 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;
+
+import android.media.CamcorderProfile;
+import android.media.EncoderProfiles;
+import android.os.Build;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.camera2.internal.compat.quirk.InvalidVideoProfilesQuirk;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesProvider;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.compat.EncoderProfilesProxyCompat;
+
+/** An implementation that provides the {@link EncoderProfilesProxy}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class Camera2EncoderProfilesProvider implements EncoderProfilesProvider {
+
+    private static final String TAG = "Camera2EncoderProfilesProvider";
+
+    private final boolean mHasValidCameraId;
+    private final String mCameraId;
+    private final int mIntCameraId;
+
+    public Camera2EncoderProfilesProvider(@NonNull String cameraId) {
+        mCameraId = cameraId;
+        boolean hasValidCameraId = false;
+        int intCameraId = -1;
+        try {
+            intCameraId = Integer.parseInt(cameraId);
+            hasValidCameraId = true;
+        } catch (NumberFormatException e) {
+            Logger.w(TAG, "Camera id is not an integer: " + cameraId
+                    + ", unable to create Camera2EncoderProfilesProvider");
+        }
+        mHasValidCameraId = hasValidCameraId;
+        mIntCameraId = intCameraId;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean hasProfile(int quality) {
+        if (!mHasValidCameraId) {
+            return false;
+        }
+
+        return CamcorderProfile.hasProfile(mIntCameraId, quality);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable
+    @Override
+    public EncoderProfilesProxy getAll(int quality) {
+        if (!mHasValidCameraId) {
+            return null;
+        }
+
+        if (!CamcorderProfile.hasProfile(mIntCameraId, quality)) {
+            return null;
+        }
+
+        return getProfilesInternal(quality);
+    }
+
+    @Nullable
+    private EncoderProfilesProxy getProfilesInternal(int quality) {
+        if (Build.VERSION.SDK_INT >= 31) {
+            EncoderProfiles profiles = Api31Impl.getAll(mCameraId, quality);
+            if (profiles == null) {
+                return null;
+            }
+
+            boolean isVideoProfilesInvalid = DeviceQuirks.get(InvalidVideoProfilesQuirk.class)
+                    != null;
+            if (isVideoProfilesInvalid) {
+                Logger.d(TAG, "EncoderProfiles contains invalid video profiles, use "
+                        + "CamcorderProfile to create EncoderProfilesProxy.");
+            } else {
+                try {
+                    return EncoderProfilesProxyCompat.from(profiles);
+                } catch (NullPointerException e) {
+                    Logger.w(TAG, "Failed to create EncoderProfilesProxy, EncoderProfiles might "
+                            + " contain invalid video profiles. Use CamcorderProfile instead.", e);
+                }
+            }
+        }
+
+        return createProfilesFromCamcorderProfile(quality);
+    }
+
+    @Nullable
+    @SuppressWarnings("deprecation")
+    private EncoderProfilesProxy createProfilesFromCamcorderProfile(int quality) {
+        CamcorderProfile profile = null;
+        try {
+            profile = CamcorderProfile.get(mIntCameraId, quality);
+        } catch (RuntimeException e) {
+            // CamcorderProfile.get() will throw
+            // - RuntimeException if not able to retrieve camcorder profile params.
+            // - IllegalArgumentException if quality is not valid.
+            Logger.w(TAG, "Unable to get CamcorderProfile by quality: " + quality, e);
+        }
+        return profile != null ? EncoderProfilesProxyCompat.from(profile) : null;
+    }
+
+    @RequiresApi(31)
+    static class Api31Impl {
+        @DoNotInline
+        static EncoderProfiles getAll(String cameraId, int quality) {
+            return CamcorderProfile.getAll(cameraId, quality);
+        }
+
+        // This class is not instantiable.
+        private Api31Impl() {
+        }
+    }
+}
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/CamcorderProfileResolutionQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
index fb2d013..abeb482 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
@@ -25,10 +25,10 @@
 import androidx.annotation.RequiresApi;
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
 import androidx.camera.camera2.internal.compat.StreamConfigurationMapCompat;
-import androidx.camera.camera2.internal.compat.workaround.CamcorderProfileResolutionValidator;
 import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesResolutionValidator;
 import androidx.camera.core.impl.ImageFormatConstants;
-import androidx.camera.core.impl.Quirk;
+import androidx.camera.core.impl.quirk.ProfileResolutionQuirk;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -52,10 +52,10 @@
  *                  resolution is contained in the list returned.
  *     Device(s): All legacy devices
  *     @see CamcorderProfile#hasProfile
- *     @see CamcorderProfileResolutionValidator
+ *     @see EncoderProfilesResolutionValidator
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class CamcorderProfileResolutionQuirk implements Quirk {
+public class CamcorderProfileResolutionQuirk implements ProfileResolutionQuirk {
     private static final String TAG = "CamcorderProfileResolutionQuirk";
 
     static boolean load(@NonNull CameraCharacteristicsCompat characteristicsCompat) {
@@ -86,6 +86,7 @@
     }
 
     /** Returns the supported video resolutions. */
+    @Override
     @NonNull
     public List<Size> getSupportedResolutions() {
         return new ArrayList<>(mSupportedResolutions);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
index 45aa1b8..ed4d62e 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
@@ -86,6 +86,9 @@
         if (ExtraSupportedOutputSizeQuirk.load()) {
             quirks.add(new ExtraSupportedOutputSizeQuirk());
         }
+        if (InvalidVideoProfilesQuirk.load()) {
+            quirks.add(new InvalidVideoProfilesQuirk());
+        }
 
         return quirks;
     }
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/main/java/androidx/camera/camera2/internal/compat/quirk/InvalidVideoProfilesQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/InvalidVideoProfilesQuirk.java
new file mode 100644
index 0000000..bb4c9e1
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/InvalidVideoProfilesQuirk.java
@@ -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.
+ */
+
+package androidx.camera.camera2.internal.compat.quirk;
+
+import android.media.EncoderProfiles;
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Quirk denoting the video profile list returns by {@link EncoderProfiles} is invalid.
+ *
+ * <p>QuirkSummary
+ *     Bug Id: 267727595
+ *     Description: When using {@link EncoderProfiles} on TP1A or TD1A builds of Android API 33,
+ *                  {@link EncoderProfiles#getVideoProfiles()} returns a list with size one, but
+ *                  the single value in the list is null. This is not the expected behavior, and
+ *                  makes {@link EncoderProfiles} lack of video information.
+ *     Device(s): Pixel 4 and above pixel devices with TP1A or TD1A builds (API 33).
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class InvalidVideoProfilesQuirk implements Quirk {
+
+    static final List<String> AFFECTED_MODELS = Arrays.asList(
+            "pixel 4",
+            "pixel 4a",
+            "pixel 4 xl",
+            "pixel 5",
+            "pixel 5a",
+            "pixel 6",
+            "pixel 6a",
+            "pixel 6 pro",
+            "pixel 7",
+            "pixel 7 pro"
+    );
+
+    static boolean load() {
+        return isAffectedModel() && isAffectedBuild();
+    }
+
+    private static boolean isAffectedModel() {
+        return AFFECTED_MODELS.contains(Build.MODEL.toLowerCase(Locale.US));
+    }
+
+    private static boolean isAffectedBuild() {
+        return isTp1aBuild() || isTd1aBuild();
+    }
+
+    private static boolean isTp1aBuild() {
+        return Build.ID.startsWith("TP1A");
+    }
+
+    private static boolean isTd1aBuild() {
+        return Build.ID.startsWith("TD1A");
+    }
+}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java
deleted file mode 100644
index e63fcda..0000000
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.camera2.internal.compat.workaround;
-
-import android.media.CamcorderProfile;
-import android.util.Size;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.camera.camera2.internal.compat.quirk.CamcorderProfileResolutionQuirk;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Validates the video resolution of {@link CamcorderProfile}.
- *
- * @see CamcorderProfileResolutionQuirk
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class CamcorderProfileResolutionValidator {
-
-    private final CamcorderProfileResolutionQuirk mQuirk;
-    private final Set<Size> mSupportedResolutions;
-
-    public CamcorderProfileResolutionValidator(@Nullable CamcorderProfileResolutionQuirk quirk) {
-        mQuirk = quirk;
-        mSupportedResolutions = quirk != null ? new HashSet<>(quirk.getSupportedResolutions()) :
-                Collections.emptySet();
-    }
-
-    /** Checks if this validator contains quirk. */
-    public boolean hasQuirk() {
-        return mQuirk != null;
-    }
-
-    /** Checks if the video resolution of CamcorderProfile is valid. */
-    public boolean hasValidVideoResolution(@Nullable CamcorderProfileProxy profile) {
-        if (profile == null) {
-            return false;
-        }
-
-        if (mQuirk == null) {
-            // Quirk doesn't exist, always valid.
-            return true;
-        }
-
-        Size videoSize = new Size(profile.getVideoFrameWidth(), profile.getVideoFrameHeight());
-        return mSupportedResolutions.contains(videoSize);
-    }
-}
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/SupportedSurfaceCombinationTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
index 760a818..1a822dd 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package androidx.camera.camera2.internal
 
 import android.content.Context
@@ -21,6 +22,10 @@
 import android.hardware.camera2.CameraCharacteristics
 import android.hardware.camera2.CameraMetadata
 import android.media.CamcorderProfile
+import android.media.CamcorderProfile.QUALITY_1080P
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_480P
+import android.media.CamcorderProfile.QUALITY_720P
 import android.os.Build
 import android.util.Pair
 import android.util.Range
@@ -62,16 +67,16 @@
 import androidx.camera.core.impl.utils.CompareSizesByArea
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.utils.SizeUtil.RESOLUTION_VGA
-import androidx.camera.testing.CamcorderProfileUtil
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.Configs
+import androidx.camera.testing.EncoderProfilesUtil
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
-import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
 import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.camera.video.FallbackStrategy
 import androidx.camera.video.MediaSpec
@@ -145,18 +150,17 @@
         CamcorderProfile::class.java
     )
     private var cameraManagerCompat: CameraManagerCompat? = null
-    private val profileUhd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_2160P, RECORD_SIZE.width, RECORD_SIZE.height
+    private val profileUhd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        RECORD_SIZE.width, RECORD_SIZE.height
     )
-    private val profileFhd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_1080P, 1920, 1080
+    private val profileFhd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        1920, 1080
     )
-    private val profileHd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_720P, PREVIEW_SIZE.width, PREVIEW_SIZE.height
+    private val profileHd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        PREVIEW_SIZE.width, PREVIEW_SIZE.height
     )
-    private val profileSd = CamcorderProfileUtil.createCamcorderProfileProxy(
-        CamcorderProfile.QUALITY_480P, RESOLUTION_VGA.width,
-        RESOLUTION_VGA.height
+    private val profileSd = EncoderProfilesUtil.createFakeEncoderProfilesProxy(
+        RESOLUTION_VGA.width, RESOLUTION_VGA.height
     )
     private val context = ApplicationProvider.getApplicationContext<Context>()
     private var cameraFactory: FakeCameraFactory? = null
@@ -3052,15 +3056,12 @@
             sensorOrientation,
             CameraCharacteristics.LENS_FACING_BACK
         ).apply {
-            camcorderProfileProvider = FakeCamcorderProfileProvider.Builder()
-                .addProfile(
-                    CamcorderProfileUtil.asHighQuality(profileUhd),
-                    profileUhd,
-                    profileFhd,
-                    profileHd,
-                    profileSd,
-                    CamcorderProfileUtil.asLowQuality(profileSd)
-                ).build()
+            encoderProfilesProvider = FakeEncoderProfilesProvider.Builder()
+                .add(QUALITY_2160P, profileUhd)
+                .add(QUALITY_1080P, profileFhd)
+                .add(QUALITY_720P, profileHd)
+                .add(QUALITY_480P, profileSd)
+                .build()
         }
 
         cameraFactory = FakeCameraFactory().apply {
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-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirkTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirkTest.kt
index f052a5a..baecee6 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirkTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirkTest.kt
@@ -23,8 +23,8 @@
 import android.os.Build
 import android.util.Size
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_1080P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_2160P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_1080P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_2160P
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -40,10 +40,10 @@
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-public class CamcorderProfileResolutionQuirkTest {
+class CamcorderProfileResolutionQuirkTest {
 
     @Test
-    public fun loadByHardwareLevel() {
+    fun loadByHardwareLevel() {
         var cameraCharacteristicsCompat =
             createCameraCharacteristicsCompat(CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
         assertThat(CamcorderProfileResolutionQuirk.load(cameraCharacteristicsCompat)).isFalse()
@@ -62,7 +62,7 @@
     }
 
     @Test
-    public fun canGetCorrectSupportedSizes() {
+    fun canGetCorrectSupportedSizes() {
         val cameraCharacteristicsCompat =
             createCameraCharacteristicsCompat(
                 supportedSizes = arrayOf(
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidatorTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidatorTest.kt
deleted file mode 100644
index 5787efb..0000000
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidatorTest.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.camera2.internal.compat.workaround
-
-import android.graphics.SurfaceTexture
-import android.hardware.camera2.CameraCharacteristics
-import android.hardware.camera2.params.StreamConfigurationMap
-import android.os.Build
-import android.util.Size
-import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat
-import androidx.camera.camera2.internal.compat.quirk.CamcorderProfileResolutionQuirk
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_2160P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_720P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_2160P
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers
-import org.mockito.Mockito
-import org.mockito.Mockito.`when`
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.annotation.Config
-import org.robolectric.annotation.internal.DoNotInstrument
-import org.robolectric.shadow.api.Shadow
-import org.robolectric.shadows.ShadowCameraCharacteristics
-
-@RunWith(RobolectricTestRunner::class)
-@DoNotInstrument
-@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-public class CamcorderProfileResolutionValidatorTest {
-
-    @Test
-    public fun noQuirk_alwaysValid() {
-        val validator = CamcorderProfileResolutionValidator(null)
-
-        assertThat(validator.hasValidVideoResolution(PROFILE_2160P)).isTrue()
-        assertThat(validator.hasValidVideoResolution(PROFILE_720P)).isTrue()
-    }
-
-    @Test
-    public fun hasQuirk_shouldCheckSupportedResolutions() {
-        val cameraCharacteristicsCompat = createCameraCharacteristicsCompat(
-            supportedResolution = arrayOf(RESOLUTION_2160P)
-        )
-        val quirk = CamcorderProfileResolutionQuirk(cameraCharacteristicsCompat)
-        val validator = CamcorderProfileResolutionValidator(quirk)
-
-        assertThat(validator.hasValidVideoResolution(PROFILE_2160P)).isTrue()
-        assertThat(validator.hasValidVideoResolution(PROFILE_720P)).isFalse()
-    }
-
-    @Test
-    public fun nullProfile_notValid() {
-        val cameraCharacteristicsCompat = createCameraCharacteristicsCompat(
-            supportedResolution = arrayOf(RESOLUTION_2160P)
-        )
-        val quirk = CamcorderProfileResolutionQuirk(cameraCharacteristicsCompat)
-        val validator = CamcorderProfileResolutionValidator(quirk)
-
-        assertThat(validator.hasValidVideoResolution(null)).isFalse()
-    }
-
-    private fun createCameraCharacteristicsCompat(
-        supportedResolution: Array<Size> = emptyArray()
-    ): CameraCharacteristicsCompat {
-        val characteristics = ShadowCameraCharacteristics.newCameraCharacteristics()
-        val shadowCharacteristics = Shadow.extract<ShadowCameraCharacteristics>(characteristics)
-
-        val mockMap = Mockito.mock(StreamConfigurationMap::class.java)
-
-        // Before Android 23, use {@link SurfaceTexture} will finally mapped to 0x22 in
-        // StreamConfigurationMap to retrieve the output sizes information.
-        `when`(mockMap.getOutputSizes(ArgumentMatchers.any<Class<SurfaceTexture>>()))
-            .thenReturn(supportedResolution)
-        `when`(mockMap.getOutputSizes(ArgumentMatchers.anyInt()))
-            .thenReturn(supportedResolution)
-
-        shadowCharacteristics.set(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP, mockMap)
-
-        return CameraCharacteristicsCompat.toCameraCharacteristicsCompat(characteristics)
-    }
-}
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.kt
index 16ee9c4c..4ad6236 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.kt
@@ -21,9 +21,6 @@
 import android.util.Rational
 import android.util.Size
 import android.view.Surface
-import androidx.camera.testing.fakes.FakeUseCaseConfig
-import androidx.camera.testing.fakes.FakeUseCase
-import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import androidx.camera.core.impl.CameraInternal
 import androidx.camera.core.impl.Config
 import androidx.camera.core.impl.ImageOutputConfig
@@ -33,23 +30,26 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
+import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeUseCase
+import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 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 org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers
 import org.mockito.Mockito
-import java.util.LinkedHashSet
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 21)
 class UseCaseTest {
     private var mockCameraInternal: CameraInternal? = null
+
     @Before
     fun setup() {
         mockCameraInternal = Mockito.mock(
@@ -58,26 +58,41 @@
     }
 
     @Test
+    fun noCameraTransform_rotationMirrored() {
+        // Arrange.
+        val testUseCase = createFakeUseCase(targetRotation = Surface.ROTATION_90)
+        val fakeCamera = FakeCamera()
+        testUseCase.hasCameraTransform = false
+        // Act/Assert:
+        assertThat(testUseCase.getRelativeRotation(fakeCamera, true)).isEqualTo(90)
+        assertThat(testUseCase.getRelativeRotation(fakeCamera, false)).isEqualTo(270)
+    }
+
+    @Test
+    fun hasCameraTransform_rotationNotMirrored() {
+        // Arrange.
+        val testUseCase = createFakeUseCase(targetRotation = Surface.ROTATION_90)
+        val fakeCamera = FakeCamera()
+        // Act/Assert:
+        assertThat(testUseCase.getRelativeRotation(fakeCamera, true)).isEqualTo(270)
+        assertThat(testUseCase.getRelativeRotation(fakeCamera, false)).isEqualTo(270)
+    }
+
+    @Test
     fun getAttachedSessionConfig() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = createFakeUseCase()
         val sessionToAttach = SessionConfig.Builder().build()
         testUseCase.updateSessionConfig(sessionToAttach)
         val attachedSession = testUseCase.sessionConfig
-        Truth.assertThat(attachedSession).isEqualTo(sessionToAttach)
+        assertThat(attachedSession).isEqualTo(sessionToAttach)
     }
 
     @Test
     fun removeListener() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = createFakeUseCase()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
         testUseCase.unbindFromCamera(mockCameraInternal!!)
-        testUseCase.activate()
+        testUseCase.notifyActive()
         Mockito.verify(mockCameraInternal, Mockito.never())!!.onUseCaseActive(
             ArgumentMatchers.any(
                 UseCase::class.java
@@ -87,43 +102,31 @@
 
     @Test
     fun notifyActiveState() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = createFakeUseCase()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
-        testUseCase.activate()
+        testUseCase.notifyActive()
         Mockito.verify(mockCameraInternal, Mockito.times(1))!!.onUseCaseActive(testUseCase)
     }
 
     @Test
     fun notifyInactiveState() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = createFakeUseCase()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
-        testUseCase.deactivate()
+        testUseCase.notifyInactive()
         Mockito.verify(mockCameraInternal, Mockito.times(1))!!.onUseCaseInactive(testUseCase)
     }
 
     @Test
     fun notifyUpdatedSettings() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = FakeUseCase()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
-        testUseCase.update()
+        testUseCase.notifyUpdated()
         Mockito.verify(mockCameraInternal, Mockito.times(1))!!.onUseCaseUpdated(testUseCase)
     }
 
     @Test
     fun notifyResetUseCase() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = FakeUseCase()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
         testUseCase.notifyReset()
         Mockito.verify(mockCameraInternal, Mockito.times(1))!!.onUseCaseReset(testUseCase)
@@ -136,47 +139,38 @@
         builder.mutableConfig.insertOption(opt, Config.OptionPriority.ALWAYS_OVERRIDE, 1)
         val fakeUseCase = builder.build()
         val useCaseConfig = fakeUseCase.currentConfig
-        Truth.assertThat(useCaseConfig.getOptionPriority(opt))
+        assertThat(useCaseConfig.getOptionPriority(opt))
             .isEqualTo(Config.OptionPriority.ALWAYS_OVERRIDE)
     }
 
     @Test
     fun attachedSurfaceResolutionCanBeReset_whenOnDetach() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = FakeUseCase()
         testUseCase.updateSuggestedStreamSpec(TEST_STREAM_SPEC)
-        Truth.assertThat(testUseCase.attachedSurfaceResolution).isNotNull()
+        assertThat(testUseCase.attachedSurfaceResolution).isNotNull()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
         testUseCase.unbindFromCamera(mockCameraInternal!!)
-        Truth.assertThat(testUseCase.attachedSurfaceResolution).isNull()
+        assertThat(testUseCase.attachedSurfaceResolution).isNull()
     }
 
     @Test
     fun attachedStreamSpecCanBeReset_whenOnDetach() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = FakeUseCase()
         testUseCase.updateSuggestedStreamSpec(TEST_STREAM_SPEC)
-        Truth.assertThat(testUseCase.attachedStreamSpec).isNotNull()
+        assertThat(testUseCase.attachedStreamSpec).isNotNull()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
         testUseCase.unbindFromCamera(mockCameraInternal!!)
-        Truth.assertThat(testUseCase.attachedStreamSpec).isNull()
+        assertThat(testUseCase.attachedStreamSpec).isNull()
     }
 
     @Test
     fun viewPortCropRectCanBeReset_whenOnDetach() {
-        val config = FakeUseCaseConfig.Builder().setTargetName(
-            "UseCase"
-        ).useCaseConfig
-        val testUseCase = TestUseCase(config)
+        val testUseCase = FakeUseCase()
         testUseCase.setViewPortCropRect(Rect(0, 0, 640, 480))
-        Truth.assertThat(testUseCase.viewPortCropRect).isNotNull()
+        assertThat(testUseCase.viewPortCropRect).isNotNull()
         testUseCase.bindToCamera(mockCameraInternal!!, null, null)
         testUseCase.unbindFromCamera(mockCameraInternal!!)
-        Truth.assertThat(testUseCase.viewPortCropRect).isNull()
+        assertThat(testUseCase.viewPortCropRect).isNull()
     }
 
     @Test
@@ -192,22 +186,22 @@
             .setBufferFormat(useCaseImageFormat).useCaseConfig
         val extendedConfig = FakeUseCaseConfig.Builder()
             .setTargetRotation(Surface.ROTATION_180).useCaseConfig
-        val testUseCase = TestUseCase(useCaseConfig)
+        val testUseCase = FakeUseCase(useCaseConfig)
         val cameraInfo = FakeCameraInfoInternal()
         val mergedConfig = testUseCase.mergeConfigs(
             cameraInfo, extendedConfig,
             defaultConfig
         )
-        Truth.assertThat(mergedConfig.surfaceOccupancyPriority).isEqualTo(cameraDefaultPriority)
-        Truth.assertThat(mergedConfig.inputFormat).isEqualTo(useCaseImageFormat)
+        assertThat(mergedConfig.surfaceOccupancyPriority).isEqualTo(cameraDefaultPriority)
+        assertThat(mergedConfig.inputFormat).isEqualTo(useCaseImageFormat)
         val imageOutputConfig = mergedConfig as ImageOutputConfig
-        Truth.assertThat(imageOutputConfig.targetRotation).isEqualTo(Surface.ROTATION_180)
+        assertThat(imageOutputConfig.targetRotation).isEqualTo(Surface.ROTATION_180)
     }
 
     @Test
     fun returnNullResolutionInfo_beforeAddingToCameraUseCaseAdapter() {
         val fakeUseCase = FakeUseCase()
-        Truth.assertThat(fakeUseCase.resolutionInfo).isNull()
+        assertThat(fakeUseCase.resolutionInfo).isNull()
     }
 
     @Test
@@ -217,15 +211,15 @@
         val cameraUseCaseAdapter = createCameraUseCaseAdapter()
         cameraUseCaseAdapter.addUseCases(listOf<UseCase>(fakeUseCase))
         val resolutionInfo = fakeUseCase.resolutionInfo
-        Truth.assertThat(resolutionInfo).isNotNull()
-        Truth.assertThat(resolutionInfo!!.resolution).isEqualTo(SURFACE_RESOLUTION)
-        Truth.assertThat(resolutionInfo.cropRect).isEqualTo(
+        assertThat(resolutionInfo).isNotNull()
+        assertThat(resolutionInfo!!.resolution).isEqualTo(SURFACE_RESOLUTION)
+        assertThat(resolutionInfo.cropRect).isEqualTo(
             Rect(
                 0, 0,
                 SURFACE_RESOLUTION.width, SURFACE_RESOLUTION.height
             )
         )
-        Truth.assertThat(resolutionInfo.rotationDegrees).isEqualTo(0)
+        assertThat(resolutionInfo.rotationDegrees).isEqualTo(0)
     }
 
     @Test
@@ -236,7 +230,7 @@
         cameraUseCaseAdapter.addUseCases(listOf<UseCase>(fakeUseCase))
         cameraUseCaseAdapter.removeUseCases(listOf<UseCase>(fakeUseCase))
         val resolutionInfo = fakeUseCase.resolutionInfo
-        Truth.assertThat(resolutionInfo).isNull()
+        assertThat(resolutionInfo).isNull()
     }
 
     @Test
@@ -247,7 +241,7 @@
         val cameraUseCaseAdapter = createCameraUseCaseAdapter()
         cameraUseCaseAdapter.addUseCases(listOf<UseCase>(fakeUseCase))
         val resolutionInfo = fakeUseCase.resolutionInfo
-        Truth.assertThat(resolutionInfo!!.rotationDegrees).isEqualTo(270)
+        assertThat(resolutionInfo!!.rotationDegrees).isEqualTo(270)
     }
 
     @Test
@@ -263,7 +257,18 @@
         )
         cameraUseCaseAdapter.addUseCases(listOf<UseCase>(fakeUseCase))
         val resolutionInfo = fakeUseCase.resolutionInfo
-        Truth.assertThat(resolutionInfo!!.cropRect).isEqualTo(Rect(0, 60, 640, 420))
+        assertThat(resolutionInfo!!.cropRect).isEqualTo(Rect(0, 60, 640, 420))
+    }
+
+    private fun createFakeUseCase(
+        targetRotation: Int = Surface.ROTATION_0
+    ): FakeUseCase {
+        return FakeUseCase(
+            FakeUseCaseConfig.Builder()
+                .setTargetName("UseCase")
+                .setTargetRotation(targetRotation)
+                .useCaseConfig
+        )
     }
 
     private fun createCameraUseCaseAdapter(): CameraUseCaseAdapter {
@@ -286,24 +291,6 @@
         )
     }
 
-    internal class TestUseCase(config: FakeUseCaseConfig?) : FakeUseCase(config!!) {
-        fun activate() {
-            notifyActive()
-        }
-
-        fun deactivate() {
-            notifyInactive()
-        }
-
-        fun update() {
-            notifyUpdated()
-        }
-
-        override fun onSuggestedStreamSpecUpdated(suggestedStreamSpec: StreamSpec): StreamSpec {
-            return suggestedStreamSpec
-        }
-    }
-
     companion object {
         private val SURFACE_RESOLUTION: Size by lazy { Size(640, 480) }
         private val TEST_STREAM_SPEC: StreamSpec by lazy {
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
deleted file mode 100644
index ce31a22..0000000
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.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.camera.core.impl
-
-import android.media.CamcorderProfile
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Assume.assumeTrue
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-@Suppress("DEPRECATION")
-@SdkSuppress(minSdkVersion = 21)
-public class CamcorderProfileProxyTest {
-
-    @Test
-    public fun createInstance() {
-        // QUALITY_HIGH is guaranteed to be supported.
-        assumeTrue(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH))
-
-        val profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)
-        val profileProxy = CamcorderProfileProxy.fromCamcorderProfile(profile)
-
-        assertThat(profileProxy.duration).isEqualTo(profile.duration)
-        assertThat(profileProxy.quality).isEqualTo(profile.quality)
-        assertThat(profileProxy.fileFormat).isEqualTo(profile.fileFormat)
-        assertThat(profileProxy.videoCodec).isEqualTo(profile.videoCodec)
-        assertThat(profileProxy.videoBitRate).isEqualTo(profile.videoBitRate)
-        assertThat(profileProxy.videoFrameRate).isEqualTo(profile.videoFrameRate)
-        assertThat(profileProxy.videoFrameWidth).isEqualTo(profile.videoFrameWidth)
-        assertThat(profileProxy.videoFrameHeight).isEqualTo(profile.videoFrameHeight)
-        assertThat(profileProxy.audioCodec).isEqualTo(profile.audioCodec)
-        assertThat(profileProxy.audioBitRate).isEqualTo(profile.audioBitRate)
-        assertThat(profileProxy.audioSampleRate).isEqualTo(profile.audioSampleRate)
-        assertThat(profileProxy.audioChannels).isEqualTo(profile.audioChannels)
-    }
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
index e0c2bc1..b248db5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
@@ -90,7 +90,10 @@
      * @return A {@link ListenableFuture} which completes with {@link FocusMeteringAction} when
      * auto focus is done and AF/AE/AWB regions are updated. In case AF points are not added,
      * auto focus will not be triggered and this {@link ListenableFuture} completes when
-     * AE/AWB regions are updated. Cancellation of this future is a no-op.
+     * AE/AWB regions are updated. It fails with {@link OperationCanceledException} if there is
+     * newer value being set or camera is closed. If none of the specified AF/AE/AWB
+     * {@link MeteringPoint} is supported, it fails with {@link IllegalArgumentException}.
+     * Cancellation of this future is a no-op.
      */
     @NonNull
     ListenableFuture<FocusMeteringResult> startFocusAndMetering(
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
index 58183ca..7416ee1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
@@ -17,11 +17,15 @@
 
 import static androidx.core.util.Preconditions.checkArgument;
 
+import static java.util.Objects.requireNonNull;
+
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
+import androidx.camera.core.processing.SurfaceProcessorWithExecutor;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -195,4 +199,21 @@
     public ImageProcessor getImageProcessor() {
         return mImageProcessor;
     }
+
+    // --- Internal methods ---
+
+    /**
+     * Creates a {@link SurfaceProcessorInternal} instance.
+     *
+     * <p>Throws {@link IllegalArgumentException} if the effect does not contain a
+     * {@link SurfaceProcessor}.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @NonNull
+    public SurfaceProcessorInternal createSurfaceProcessorInternal() {
+        return new SurfaceProcessorWithExecutor(requireNonNull(getSurfaceProcessor()),
+                getExecutor());
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index d5f8971..75bbe4f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -340,9 +340,6 @@
     @SuppressWarnings("WeakerAccess")
     final Executor mSequentialIoExecutor;
 
-    @Nullable
-    private CameraEffect mCameraEffect;
-
     /**
      * Creates a new image capture use case from the given configuration.
      *
@@ -1664,7 +1661,7 @@
         Size resolution = streamSpec.getResolution();
 
         checkState(mImagePipeline == null);
-        mImagePipeline = new ImagePipeline(config, resolution, mCameraEffect);
+        mImagePipeline = new ImagePipeline(config, resolution, getEffect());
 
         if (mTakePictureManager == null) {
             // mTakePictureManager is reused when the Surface is reset.
@@ -1805,27 +1802,6 @@
         return mImagePipeline != null && mTakePictureManager != null;
     }
 
-    /**
-     * @hide
-     */
-    @MainThread
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public void setEffect(@Nullable CameraEffect cameraEffect) {
-        checkMainThread();
-        mCameraEffect = cameraEffect;
-    }
-
-    /**
-     * @hide
-     */
-    @MainThread
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public CameraEffect getEffect() {
-        checkMainThread();
-        return mCameraEffect;
-    }
-
     @VisibleForTesting
     @NonNull
     TakePictureManager getTakePictureManager() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index c9de0b5..72331e6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -82,12 +82,10 @@
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.core.internal.TargetConfig;
 import androidx.camera.core.internal.ThreadConfig;
 import androidx.camera.core.processing.Node;
 import androidx.camera.core.processing.SurfaceEdge;
-import androidx.camera.core.processing.SurfaceProcessorInternal;
 import androidx.camera.core.processing.SurfaceProcessorNode;
 import androidx.core.util.Consumer;
 import androidx.lifecycle.LifecycleOwner;
@@ -191,9 +189,6 @@
     private Size mSurfaceSize;
 
     @Nullable
-    private SurfaceProcessorInternal mSurfaceProcessor;
-
-    @Nullable
     private SurfaceProcessorNode mNode;
 
     /**
@@ -213,7 +208,7 @@
             @NonNull StreamSpec streamSpec) {
         // Build pipeline with node if processor is set. Eventually we will move all the code to
         // createPipelineWithNode.
-        if (mSurfaceProcessor != null) {
+        if (getEffect() != null) {
             return createPipelineWithNode(cameraId, config, streamSpec);
         }
 
@@ -251,14 +246,13 @@
             @NonNull StreamSpec streamSpec) {
         // Check arguments
         checkMainThread();
-        checkNotNull(mSurfaceProcessor);
-        CameraInternal camera = getCamera();
-        checkNotNull(camera);
+        CameraEffect effect = requireNonNull(getEffect());
+        CameraInternal camera = requireNonNull(getCamera());
 
         clearPipeline();
 
         // Create nodes and edges.
-        mNode = new SurfaceProcessorNode(camera, mSurfaceProcessor);
+        mNode = new SurfaceProcessorNode(camera, effect.createSurfaceProcessorInternal());
         // Make sure the previously created camera edge is cleared before creating a new one.
         checkState(mCameraEdge == null);
         mCameraEdge = new SurfaceEdge(
@@ -267,7 +261,7 @@
                 new Matrix(),
                 getHasCameraTransform(),
                 requireNonNull(getCropRect(streamSpec.getResolution())),
-                getRelativeRotation(camera),
+                getRelativeRotation(camera, camera.isFrontFacing()),
                 shouldMirror());
         mCameraEdge.addOnInvalidatedListener(this::notifyReset);
         SurfaceProcessorNode.OutConfig outConfig = SurfaceProcessorNode.OutConfig.of(mCameraEdge);
@@ -311,31 +305,6 @@
     }
 
     /**
-     * Sets a {@link SurfaceProcessorInternal}.
-     *
-     * <p>Internal API invoked by {@link CameraUseCaseAdapter}. {@link #createPipeline} uses the
-     * value to setup post-processing pipeline.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public void setProcessor(@Nullable SurfaceProcessorInternal surfaceProcessor) {
-        mSurfaceProcessor = surfaceProcessor;
-    }
-
-    /**
-     * Gets the {@link SurfaceProcessorInternal} for testing.
-     *
-     * @hide
-     */
-    @Nullable
-    @VisibleForTesting
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public SurfaceProcessorInternal getProcessor() {
-        return mSurfaceProcessor;
-    }
-
-    /**
      * Creates previously allocated {@link DeferrableSurface} include those allocated by nodes.
      */
     private void clearPipeline() {
@@ -427,11 +396,12 @@
             if (mNode == null) {
                 surfaceRequest.updateTransformationInfo(SurfaceRequest.TransformationInfo.of(
                         cropRect,
-                        getRelativeRotation(cameraInternal),
+                        getRelativeRotation(cameraInternal, cameraInternal.isFrontFacing()),
                         getAppTargetRotation(),
                         getHasCameraTransform()));
             } else {
-                mCameraEdge.setRotationDegrees(getRelativeRotation(cameraInternal));
+                mCameraEdge.setRotationDegrees(
+                        getRelativeRotation(cameraInternal, cameraInternal.isFrontFacing()));
             }
         }
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
index e37d862..47c501d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.impl.utils.TransformUtils.within360;
+
 import android.annotation.SuppressLint;
 import android.graphics.Matrix;
 import android.graphics.Rect;
@@ -145,6 +147,9 @@
     @GuardedBy("mCameraLock")
     private CameraInternal mCamera;
 
+    @Nullable
+    private CameraEffect mEffect;
+
     ////////////////////////////////////////////////////////////////////////////////////////////
     // [UseCase attached dynamic] - Can change but is only available when the UseCase is attached.
     ////////////////////////////////////////////////////////////////////////////////////////////
@@ -342,15 +347,36 @@
     }
 
     /**
-     * Gets the relative rotation degrees based on the target rotation.
+     * Gets the relative rotation degrees without mirroring.
      *
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @IntRange(from = 0, to = 359)
     protected int getRelativeRotation(@NonNull CameraInternal cameraInternal) {
-        return cameraInternal.getCameraInfoInternal().getSensorRotationDegrees(
+        return getRelativeRotation(cameraInternal, /*requireMirroring=*/false);
+    }
+
+    /**
+     * Gets the relative rotation degrees given whether the output should be mirrored.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @IntRange(from = 0, to = 359)
+    protected int getRelativeRotation(@NonNull CameraInternal cameraInternal,
+            boolean requireMirroring) {
+        int rotation = cameraInternal.getCameraInfoInternal().getSensorRotationDegrees(
                 getTargetRotationInternal());
+        // Parent UseCase always mirror the stream if the child requires it. No camera transform
+        // means that the stream is copied by a parent, and if the child also requires mirroring,
+        // we know that the stream has been mirrored.
+        boolean inputStreamMirrored = !mHasCameraTransform && requireMirroring;
+        if (inputStreamMirrored) {
+            // Flip rotation if the stream has been mirrored.
+            rotation = within360(-rotation);
+        }
+        return rotation;
     }
 
     /**
@@ -768,6 +794,27 @@
     }
 
     /**
+     * Sets the {@link CameraEffect} associated with this use case.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public void setEffect(@Nullable CameraEffect effect) {
+        mEffect = effect;
+    }
+
+    /**
+     * Gets the {@link CameraEffect} associated with this use case.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public CameraEffect getEffect() {
+        return mEffect;
+    }
+
+    /**
      * Sets whether the producer writes camera transform to the {@link Surface}.
      *
      * @hide
@@ -789,8 +836,6 @@
         return mHasCameraTransform;
     }
 
-
-
     /**
      * Gets the view port crop rect.
      *
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCamera.java b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCamera.java
new file mode 100644
index 0000000..864d033
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCamera.java
@@ -0,0 +1,79 @@
+/*
+ * 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.concurrent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.camera.core.Camera;
+
+import java.util.List;
+
+/**
+ * Concurrent camera instance.
+ */
+@RequiresApi(21)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class ConcurrentCamera {
+
+    @NonNull
+    private List<Camera> mCameras;
+
+    ConcurrentCamera(@NonNull List<Camera> cameras) {
+        mCameras = cameras;
+    }
+
+    /**
+     * Gets the list of cameras.
+     */
+    @NonNull
+    public List<Camera> getCameras() {
+        return mCameras;
+    }
+
+    /**
+     * Builder for concurrent camera instance.
+     */
+    public static class Builder {
+
+        @NonNull
+        private List<Camera> mCameras;
+
+        public Builder() {}
+
+        /**
+         * Sets the list of cameras.
+         *
+         * @param cameras cameras
+         * @return {@link Builder}
+         */
+        @NonNull
+        public Builder setCameras(@NonNull List<Camera> cameras) {
+            mCameras = cameras;
+            return this;
+        }
+
+        /**
+         * Builds the {@link ConcurrentCamera}.
+         * @return {@link ConcurrentCamera}.
+         */
+        @NonNull
+        public ConcurrentCamera builder() {
+            return new ConcurrentCamera(mCameras);
+        }
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCameraConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCameraConfig.java
new file mode 100644
index 0000000..bf8f007
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/ConcurrentCameraConfig.java
@@ -0,0 +1,78 @@
+/*
+ * 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.concurrent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+
+import java.util.List;
+
+/**
+ * Concurrent Camera Configuration.
+ */
+@RequiresApi(21)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public final class ConcurrentCameraConfig {
+    @NonNull
+    private List<SingleCameraConfig> mSingleCameraConfigs;
+
+    ConcurrentCameraConfig(@NonNull List<SingleCameraConfig> singleCameraConfigs) {
+        mSingleCameraConfigs = singleCameraConfigs;
+    }
+
+    /**
+     * Returns single camera configs.
+     * @return list of single camera configs.
+     */
+    @NonNull
+    public List<SingleCameraConfig> getSingleCameraConfigs() {
+        return mSingleCameraConfigs;
+    }
+
+    /**
+     * Builder for concurrent camera config.
+     */
+    public static class Builder {
+
+        @NonNull
+        private List<SingleCameraConfig> mSingleCameraConfigs;
+
+        public Builder() {}
+
+        /**
+         * Sets the list of single camera configs.
+         * @param singleCameraConfigs list of single camera configs.
+         * @return {@link Builder}.
+         */
+        @NonNull
+        public Builder setCameraConfigs(@NonNull List<SingleCameraConfig> singleCameraConfigs) {
+            mSingleCameraConfigs = singleCameraConfigs;
+            return this;
+        }
+
+        /**
+         * Builds the {@link ConcurrentCameraConfig}.
+         * @return {@link ConcurrentCameraConfig}.
+         */
+        @NonNull
+        public ConcurrentCameraConfig build() {
+            return new ConcurrentCameraConfig(mSingleCameraConfigs);
+        }
+
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/concurrent/SingleCameraConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/SingleCameraConfig.java
new file mode 100644
index 0000000..c46e856
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/concurrent/SingleCameraConfig.java
@@ -0,0 +1,119 @@
+/*
+ * 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.concurrent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.camera.core.CameraSelector;
+import androidx.camera.core.UseCaseGroup;
+import androidx.lifecycle.LifecycleOwner;
+
+/**
+ * Single Camera Configuration.
+ */
+@RequiresApi(21)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public final class SingleCameraConfig {
+
+    @NonNull
+    private CameraSelector mCameraSelector;
+    @NonNull
+    private LifecycleOwner mLifecycleOwner;
+    @NonNull
+    private UseCaseGroup mUseCaseGroup;
+
+    SingleCameraConfig(
+            @NonNull CameraSelector cameraSelector,
+            @NonNull LifecycleOwner lifecycleOwner,
+            @NonNull UseCaseGroup useCaseGroup) {
+        this.mCameraSelector = cameraSelector;
+        this.mLifecycleOwner = lifecycleOwner;
+        this.mUseCaseGroup = useCaseGroup;
+    }
+
+    @NonNull
+    public CameraSelector getCameraSelector() {
+        return mCameraSelector;
+    }
+
+    @NonNull
+    public LifecycleOwner getLifecycleOwner() {
+        return mLifecycleOwner;
+    }
+
+    @NonNull
+    public UseCaseGroup getUseCaseGroup() {
+        return mUseCaseGroup;
+    }
+
+    /**
+     * Build for single camera config.
+     */
+    public static class Builder {
+        @NonNull
+        private CameraSelector mCameraSelector;
+        @NonNull
+        private LifecycleOwner mLifecycleOwner;
+        @NonNull
+        private UseCaseGroup mUseCaseGroup;
+
+        public Builder() {}
+
+        /**
+         * Sets {@link CameraSelector}.
+         * @param cameraSelector
+         * @return {@link Builder}.
+         */
+        @NonNull
+        public Builder setCameraSelector(@NonNull CameraSelector cameraSelector) {
+            mCameraSelector = cameraSelector;
+            return this;
+        }
+
+        /**
+         * Sets {@link LifecycleOwner}.
+         * @param lifecycleOwner
+         * @return {@link Builder}.
+         */
+        @NonNull
+        public Builder setLifecycleOwner(@NonNull LifecycleOwner lifecycleOwner) {
+            mLifecycleOwner = lifecycleOwner;
+            return this;
+        }
+
+        /**
+         * Sets {@link UseCaseGroup}.
+         * @param useCaseGroup
+         * @return {@link Builder}.
+         */
+        @NonNull
+        public Builder setUseCaseGroup(@NonNull UseCaseGroup useCaseGroup) {
+            mUseCaseGroup = useCaseGroup;
+            return this;
+        }
+
+        /**
+         * Builds the {@link SingleCameraConfig}.
+         * @return {@link SingleCameraConfig}.
+         */
+        @NonNull
+        public SingleCameraConfig build() {
+            return new SingleCameraConfig(mCameraSelector, mLifecycleOwner, mUseCaseGroup);
+        }
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
deleted file mode 100644
index e8ed228..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.core.impl;
-
-import android.media.CamcorderProfile;
-
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-
-/**
- * CamcorderProfileProvider is used to obtain the {@link CamcorderProfileProxy}.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public interface CamcorderProfileProvider {
-
-    /**
-     * Check if the quality is supported on this device.
-     *
-     * <p>The quality should be one of quality constants defined in {@link CamcorderProfile}.
-     */
-    boolean hasProfile(int quality);
-
-    /**
-     * Gets the {@link CamcorderProfileProxy} if the quality is supported on the device.
-     *
-     * <p>The quality should be one of quality constants defined in {@link CamcorderProfile}.
-     *
-     * @see #hasProfile(int)
-     */
-    @Nullable
-    CamcorderProfileProxy get(int quality);
-
-    /** An implementation that contains no data. */
-    CamcorderProfileProvider EMPTY = new CamcorderProfileProvider() {
-        @Override
-        public boolean hasProfile(int quality) {
-            return false;
-        }
-
-        @Nullable
-        @Override
-        public CamcorderProfileProxy get(int quality) {
-            return null;
-        }
-    };
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
deleted file mode 100644
index 325c32f..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.core.impl;
-
-import static android.media.MediaRecorder.AudioEncoder.AAC;
-import static android.media.MediaRecorder.AudioEncoder.AAC_ELD;
-import static android.media.MediaRecorder.AudioEncoder.AMR_NB;
-import static android.media.MediaRecorder.AudioEncoder.AMR_WB;
-import static android.media.MediaRecorder.AudioEncoder.HE_AAC;
-import static android.media.MediaRecorder.AudioEncoder.OPUS;
-import static android.media.MediaRecorder.AudioEncoder.VORBIS;
-import static android.media.MediaRecorder.VideoEncoder.H263;
-import static android.media.MediaRecorder.VideoEncoder.H264;
-import static android.media.MediaRecorder.VideoEncoder.HEVC;
-import static android.media.MediaRecorder.VideoEncoder.MPEG_4_SP;
-import static android.media.MediaRecorder.VideoEncoder.VP8;
-
-import android.media.CamcorderProfile;
-import android.media.MediaCodecInfo;
-import android.media.MediaFormat;
-import android.media.MediaRecorder;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-
-import com.google.auto.value.AutoValue;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * CamcorderProfileProxy defines the get methods that is mapping to the fields of
- * {@link CamcorderProfile}.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-@AutoValue
-public abstract class CamcorderProfileProxy {
-
-    /** Constant representing no codec profile. */
-    public static int CODEC_PROFILE_NONE = -1;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({H263, H264, HEVC, VP8, MPEG_4_SP, MediaRecorder.VideoEncoder.DEFAULT})
-    @interface VideoEncoder {
-    }
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({AAC, AAC_ELD, AMR_NB, AMR_WB, HE_AAC, OPUS, VORBIS,
-            MediaRecorder.AudioEncoder.DEFAULT})
-    @interface AudioEncoder {
-    }
-
-    /** Creates a CamcorderProfileProxy instance. */
-    @NonNull
-    public static CamcorderProfileProxy create(int duration,
-            int quality,
-            int fileFormat,
-            @VideoEncoder int videoCodec,
-            int videoBitRate,
-            int videoFrameRate,
-            int videoFrameWidth,
-            int videoFrameHeight,
-            @AudioEncoder int audioCodec,
-            int audioBitRate,
-            int audioSampleRate,
-            int audioChannels) {
-        return new AutoValue_CamcorderProfileProxy(
-                duration,
-                quality,
-                fileFormat,
-                videoCodec,
-                videoBitRate,
-                videoFrameRate,
-                videoFrameWidth,
-                videoFrameHeight,
-                audioCodec,
-                audioBitRate,
-                audioSampleRate,
-                audioChannels
-        );
-    }
-
-    /** Creates a CamcorderProfileProxy instance from {@link CamcorderProfile}. */
-    @NonNull
-    public static CamcorderProfileProxy fromCamcorderProfile(
-            @NonNull CamcorderProfile camcorderProfile) {
-        return new AutoValue_CamcorderProfileProxy(
-                camcorderProfile.duration,
-                camcorderProfile.quality,
-                camcorderProfile.fileFormat,
-                camcorderProfile.videoCodec,
-                camcorderProfile.videoBitRate,
-                camcorderProfile.videoFrameRate,
-                camcorderProfile.videoFrameWidth,
-                camcorderProfile.videoFrameHeight,
-                camcorderProfile.audioCodec,
-                camcorderProfile.audioBitRate,
-                camcorderProfile.audioSampleRate,
-                camcorderProfile.audioChannels
-        );
-    }
-
-    /** @see CamcorderProfile#duration */
-    public abstract int getDuration();
-
-    /** @see CamcorderProfile#quality */
-    public abstract int getQuality();
-
-    /** @see CamcorderProfile#fileFormat */
-    public abstract int getFileFormat();
-
-    /** @see CamcorderProfile#videoCodec */
-    @VideoEncoder
-    public abstract int getVideoCodec();
-
-    /** @see CamcorderProfile#videoBitRate */
-    public abstract int getVideoBitRate();
-
-    /** @see CamcorderProfile#videoFrameRate */
-    public abstract int getVideoFrameRate();
-
-    /** @see CamcorderProfile#videoFrameWidth */
-    public abstract int getVideoFrameWidth();
-
-    /** @see CamcorderProfile#videoFrameHeight */
-    public abstract int getVideoFrameHeight();
-
-    /** @see CamcorderProfile#audioCodec */
-    @AudioEncoder
-    public abstract int getAudioCodec();
-
-    /** @see CamcorderProfile#audioBitRate */
-    public abstract int getAudioBitRate();
-
-    /** @see CamcorderProfile#audioSampleRate */
-    public abstract int getAudioSampleRate();
-
-    /** @see CamcorderProfile#audioChannels */
-    public abstract int getAudioChannels();
-
-    /**
-     * Returns a mime-type string for the video codec type returned by {@link #getVideoCodec()}.
-     *
-     * @return A mime-type string or {@code null} if the codec type is
-     * {@link android.media.MediaRecorder.VideoEncoder#DEFAULT}, as this type is under-defined
-     * and cannot be resolved to a specific mime type without more information.
-     */
-    @Nullable
-    public String getVideoCodecMimeType() {
-        // Mime-type definitions taken from
-        // frameworks/av/media/libstagefright/foundation/MediaDefs.cpp
-        switch (getVideoCodec()) {
-            case H263:
-                return MediaFormat.MIMETYPE_VIDEO_H263;
-            case H264:
-                return MediaFormat.MIMETYPE_VIDEO_AVC;
-            case HEVC:
-                return MediaFormat.MIMETYPE_VIDEO_HEVC;
-            case VP8:
-                return MediaFormat.MIMETYPE_VIDEO_VP8;
-            case MPEG_4_SP:
-                return MediaFormat.MIMETYPE_VIDEO_MPEG4;
-            case MediaRecorder.VideoEncoder.DEFAULT:
-                break;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a mime-type string for the audio codec type returned by {@link #getAudioCodec()}.
-     *
-     * @return A mime-type string or {@code null} if the codec type is
-     * {@link android.media.MediaRecorder.AudioEncoder#DEFAULT}, as this type is under-defined
-     * and cannot be resolved to a specific mime type without more information.
-     */
-    @Nullable
-    public String getAudioCodecMimeType() {
-        // Mime-type definitions taken from
-        // frameworks/av/media/libstagefright/foundation/MediaDefs.cpp
-        switch (getAudioCodec()) {
-            case AAC: // Should use aac-profile LC
-            case HE_AAC: // Should use aac-profile HE
-            case AAC_ELD: // Should use aac-profile ELD
-                return MediaFormat.MIMETYPE_AUDIO_AAC;
-            case AMR_NB:
-                return MediaFormat.MIMETYPE_AUDIO_AMR_NB;
-            case AMR_WB:
-                return MediaFormat.MIMETYPE_AUDIO_AMR_WB;
-            case OPUS:
-                return MediaFormat.MIMETYPE_AUDIO_OPUS;
-            case VORBIS:
-                return MediaFormat.MIMETYPE_AUDIO_VORBIS;
-            case MediaRecorder.AudioEncoder.DEFAULT:
-                break;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the required audio profile for the audio encoder given by {@link #getAudioCodec()}.
-     *
-     * <p>For example, this can be used to differentiate between AAC encoders
-     * {@link android.media.MediaRecorder.AudioEncoder#AAC},
-     * {@link android.media.MediaRecorder.AudioEncoder#AAC_ELD},
-     * and {@link android.media.MediaRecorder.AudioEncoder#HE_AAC}.
-     * Should be used with the {@link MediaCodecInfo.CodecProfileLevel#profile} field.
-     *
-     * @return The profile required by the audio codec. If no profile is required, returns
-     * {@link #CODEC_PROFILE_NONE}.
-     */
-    public int getRequiredAudioProfile() {
-        switch (getAudioCodec()) {
-            case AAC:
-                return MediaCodecInfo.CodecProfileLevel.AACObjectLC;
-            case AAC_ELD:
-                return MediaCodecInfo.CodecProfileLevel.AACObjectELD;
-            case HE_AAC:
-                return MediaCodecInfo.CodecProfileLevel.AACObjectHE;
-            default:
-                return CODEC_PROFILE_NONE;
-        }
-    }
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
index 633c72c..1fb2f48 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
@@ -65,9 +65,9 @@
     @NonNull
     Quirks getCameraQuirks();
 
-    /** Returns the {@link CamcorderProfileProvider} associated with this camera. */
+    /** Returns the {@link EncoderProfilesProvider} associated with this camera. */
     @NonNull
-    CamcorderProfileProvider getCamcorderProfileProvider();
+    EncoderProfilesProvider getEncoderProfilesProvider();
 
     /** Returns the {@link Timebase} of frame output by this camera. */
     @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
index 25ebd61..71f1696fe 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
@@ -22,6 +22,7 @@
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
+import androidx.camera.core.CameraSelector;
 import androidx.camera.core.UseCase;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -131,6 +132,13 @@
     }
 
     /**
+     * Whether the camera is front facing.
+     */
+    default boolean isFrontFacing() {
+        return getCameraInfo().getLensFacing() == CameraSelector.LENS_FACING_FRONT;
+    }
+
+    /**
      * Release the camera.
      *
      * <p>Once the camera is released it is permanently closed. A new instance must be created to
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProvider.java
new file mode 100644
index 0000000..1e041d6
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProvider.java
@@ -0,0 +1,60 @@
+/*
+ * 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.impl;
+
+import android.media.CamcorderProfile;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+/**
+ * EncoderProfilesProvider is used to obtain the {@link EncoderProfilesProxy}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface EncoderProfilesProvider {
+
+    /**
+     * Checks if the quality is supported on this device.
+     *
+     * <p>The quality should be one of quality constants defined in {@link CamcorderProfile}.
+     */
+    boolean hasProfile(int quality);
+
+    /**
+     * Gets the {@link EncoderProfilesProxy} if the quality is supported on the device.
+     *
+     * <p>The quality should be one of quality constants defined in {@link CamcorderProfile}.
+     *
+     * @see #hasProfile(int)
+     */
+    @Nullable
+    EncoderProfilesProxy getAll(int quality);
+
+    /** An implementation that contains no data. */
+    EncoderProfilesProvider EMPTY = new EncoderProfilesProvider() {
+        @Override
+        public boolean hasProfile(int quality) {
+            return false;
+        }
+
+        @Nullable
+        @Override
+        public EncoderProfilesProxy getAll(int quality) {
+            return null;
+        }
+    };
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProxy.java
new file mode 100644
index 0000000..f37cb38
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesProxy.java
@@ -0,0 +1,231 @@
+/*
+ * 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.impl;
+
+import static android.media.MediaRecorder.AudioEncoder.AAC;
+import static android.media.MediaRecorder.AudioEncoder.AAC_ELD;
+import static android.media.MediaRecorder.AudioEncoder.AMR_NB;
+import static android.media.MediaRecorder.AudioEncoder.AMR_WB;
+import static android.media.MediaRecorder.AudioEncoder.HE_AAC;
+import static android.media.MediaRecorder.AudioEncoder.OPUS;
+import static android.media.MediaRecorder.AudioEncoder.VORBIS;
+import static android.media.MediaRecorder.VideoEncoder.AV1;
+import static android.media.MediaRecorder.VideoEncoder.DOLBY_VISION;
+import static android.media.MediaRecorder.VideoEncoder.H263;
+import static android.media.MediaRecorder.VideoEncoder.H264;
+import static android.media.MediaRecorder.VideoEncoder.HEVC;
+import static android.media.MediaRecorder.VideoEncoder.MPEG_4_SP;
+import static android.media.MediaRecorder.VideoEncoder.VP8;
+import static android.media.MediaRecorder.VideoEncoder.VP9;
+
+import static java.util.Collections.unmodifiableList;
+
+import android.media.EncoderProfiles;
+import android.media.MediaRecorder;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import com.google.auto.value.AutoValue;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * EncoderProfilesProxy defines the get methods that is mapping to the fields of
+ * {@link EncoderProfiles}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface EncoderProfilesProxy {
+
+    /** Constant representing no codec profile. */
+    int CODEC_PROFILE_NONE = -1;
+
+    /** @see EncoderProfiles#getDefaultDurationSeconds() */
+    int getDefaultDurationSeconds();
+
+    /** @see EncoderProfiles#getRecommendedFileFormat() */
+    int getRecommendedFileFormat();
+
+    /** @see EncoderProfiles#getAudioProfiles() */
+    @NonNull
+    List<AudioProfileProxy> getAudioProfiles();
+
+    /** @see EncoderProfiles#getVideoProfiles() */
+    @NonNull
+    List<VideoProfileProxy> getVideoProfiles();
+
+    /**
+     * VideoProfileProxy defines the get methods that is mapping to the fields of
+     * {@link EncoderProfiles.VideoProfile}.
+     */
+    @AutoValue
+    abstract class VideoProfileProxy {
+
+        /** Constant representing no media type. */
+        public static final String MEDIA_TYPE_NONE = "video/none";
+
+        /** Constant representing bit depth 8. */
+        public static final int BIT_DEPTH_8 = 8;
+
+        @Retention(RetentionPolicy.SOURCE)
+        @IntDef({H263, H264, HEVC, VP8, MPEG_4_SP, VP9, DOLBY_VISION, AV1,
+                MediaRecorder.VideoEncoder.DEFAULT})
+        public @interface VideoEncoder {
+        }
+
+        /** Creates a VideoProfileProxy instance. */
+        @NonNull
+        public static VideoProfileProxy create(
+                @VideoEncoder int codec,
+                @NonNull String mediaType,
+                int bitrate,
+                int frameRate,
+                int width,
+                int height,
+                int profile,
+                int bitDepth,
+                int chromaSubsampling,
+                int hdrFormat) {
+            return new AutoValue_EncoderProfilesProxy_VideoProfileProxy(
+                    codec,
+                    mediaType,
+                    bitrate,
+                    frameRate,
+                    width,
+                    height,
+                    profile,
+                    bitDepth,
+                    chromaSubsampling,
+                    hdrFormat
+            );
+        }
+
+        /** @see EncoderProfiles.VideoProfile#getCodec() */
+        @VideoEncoder
+        public abstract int getCodec();
+
+        /** @see EncoderProfiles.VideoProfile#getMediaType() */
+        @NonNull
+        public abstract String getMediaType();
+
+        /** @see EncoderProfiles.VideoProfile#getBitrate() */
+        public abstract int getBitrate();
+
+        /** @see EncoderProfiles.VideoProfile#getFrameRate() */
+        public abstract int getFrameRate();
+
+        /** @see EncoderProfiles.VideoProfile#getWidth() */
+        public abstract int getWidth();
+
+        /** @see EncoderProfiles.VideoProfile#getHeight() */
+        public abstract int getHeight();
+
+        /** @see EncoderProfiles.VideoProfile#getProfile() */
+        public abstract int getProfile();
+
+        /** @see EncoderProfiles.VideoProfile#getBitDepth() */
+        public abstract int getBitDepth();
+
+        /** @see EncoderProfiles.VideoProfile#getChromaSubsampling() */
+        public abstract int getChromaSubsampling();
+
+        /** @see EncoderProfiles.VideoProfile#getHdrFormat() */
+        public abstract int getHdrFormat();
+    }
+
+    /**
+     * AudioProfileProxy defines the get methods that is mapping to the fields of
+     * {@link EncoderProfiles.AudioProfile}.
+     */
+    @AutoValue
+    abstract class AudioProfileProxy {
+
+        /** Constant representing no media type. */
+        public static final String MEDIA_TYPE_NONE = "audio/none";
+
+        @Retention(RetentionPolicy.SOURCE)
+        @IntDef({AAC, AAC_ELD, AMR_NB, AMR_WB, HE_AAC, OPUS, VORBIS,
+                MediaRecorder.AudioEncoder.DEFAULT})
+        public @interface AudioEncoder {
+        }
+
+        /** Creates an AudioProfileProxy instance. */
+        @NonNull
+        public static AudioProfileProxy create(
+                @AudioEncoder int codec,
+                @NonNull String mediaType,
+                int bitRate,
+                int sampleRate,
+                int channels,
+                int profile) {
+            return new AutoValue_EncoderProfilesProxy_AudioProfileProxy(
+                    codec,
+                    mediaType,
+                    bitRate,
+                    sampleRate,
+                    channels,
+                    profile
+            );
+        }
+
+        /** @see EncoderProfiles.AudioProfile#getCodec() */
+        @AudioEncoder
+        public abstract int getCodec();
+
+        /** @see EncoderProfiles.AudioProfile#getMediaType() */
+        @NonNull
+        public abstract String getMediaType();
+
+        /** @see EncoderProfiles.AudioProfile#getBitrate() */
+        public abstract int getBitrate();
+
+        /** @see EncoderProfiles.AudioProfile#getSampleRate() */
+        public abstract int getSampleRate();
+
+        /** @see EncoderProfiles.AudioProfile#getChannels() */
+        public abstract int getChannels();
+
+        /** @see EncoderProfiles.AudioProfile#getProfile() */
+        public abstract int getProfile();
+    }
+
+    /**
+     * An implementation of {@link EncoderProfilesProxy} that is immutable.
+     */
+    @AutoValue
+    abstract class ImmutableEncoderProfilesProxy implements EncoderProfilesProxy {
+
+        /** Creates an EncoderProfilesProxy instance. */
+        @NonNull
+        public static ImmutableEncoderProfilesProxy create(
+                int defaultDurationSeconds,
+                int recommendedFileFormat,
+                @NonNull List<AudioProfileProxy> audioProfiles,
+                @NonNull List<VideoProfileProxy> videoProfiles) {
+            return new AutoValue_EncoderProfilesProxy_ImmutableEncoderProfilesProxy(
+                    defaultDurationSeconds,
+                    recommendedFileFormat,
+                    unmodifiableList(new ArrayList<>(audioProfiles)),
+                    unmodifiableList(new ArrayList<>(videoProfiles))
+            );
+        }
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesResolutionValidator.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesResolutionValidator.java
new file mode 100644
index 0000000..1c54463
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/EncoderProfilesResolutionValidator.java
@@ -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.camera.core.impl;
+
+import android.media.EncoderProfiles;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy.ImmutableEncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+import androidx.camera.core.impl.quirk.ProfileResolutionQuirk;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Validates the video resolution of {@link EncoderProfiles}.
+ *
+ * @see ProfileResolutionQuirk
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class EncoderProfilesResolutionValidator {
+
+    @NonNull
+    private final List<ProfileResolutionQuirk> mQuirks;
+    @NonNull
+    private final Set<Size> mSupportedResolutions;
+
+    public EncoderProfilesResolutionValidator(@Nullable List<ProfileResolutionQuirk> quirks) {
+        mQuirks = new ArrayList<>();
+        if (quirks != null) {
+            mQuirks.addAll(quirks);
+        }
+
+        mSupportedResolutions = generateSupportedResolutions(quirks);
+    }
+
+    @NonNull
+    private Set<Size> generateSupportedResolutions(@Nullable List<ProfileResolutionQuirk> quirks) {
+        if (quirks == null || quirks.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        Set<Size> supportedResolutions = new HashSet<>(quirks.get(0).getSupportedResolutions());
+        for (int i = 1; i < quirks.size(); i++) {
+            supportedResolutions.retainAll(quirks.get(i).getSupportedResolutions());
+        }
+
+        return supportedResolutions;
+    }
+
+    /** Checks if this validator contains quirk. */
+    public boolean hasQuirk() {
+        return !mQuirks.isEmpty();
+    }
+
+    /** Checks if any video resolution of EncoderProfiles is valid. */
+    public boolean hasValidVideoResolution(@Nullable EncoderProfilesProxy profiles) {
+        if (profiles == null) {
+            return false;
+        }
+
+        if (!hasQuirk()) {
+            return !profiles.getVideoProfiles().isEmpty();
+        }
+
+        boolean hasValidResolution = false;
+        for (VideoProfileProxy videoProfile : profiles.getVideoProfiles()) {
+            Size videoSize = new Size(videoProfile.getWidth(), videoProfile.getHeight());
+            if (mSupportedResolutions.contains(videoSize)) {
+                hasValidResolution = true;
+                break;
+            }
+        }
+
+        return hasValidResolution;
+    }
+
+    /** Returns an {@link EncoderProfilesProxy} that filters out invalid resolutions. */
+    @Nullable
+    public EncoderProfilesProxy filterInvalidVideoResolution(
+            @Nullable EncoderProfilesProxy profiles) {
+        if (profiles == null) {
+            return null;
+        }
+
+        if (!hasQuirk()) {
+            return profiles;
+        }
+
+        List<VideoProfileProxy> validVideoProfiles = new ArrayList<>();
+        for (VideoProfileProxy videoProfile : profiles.getVideoProfiles()) {
+            Size videoSize = new Size(videoProfile.getWidth(), videoProfile.getHeight());
+            if (mSupportedResolutions.contains(videoSize)) {
+                validVideoProfiles.add(videoProfile);
+            }
+        }
+
+        return validVideoProfiles.isEmpty() ? null : ImmutableEncoderProfilesProxy.create(
+                profiles.getDefaultDurationSeconds(),
+                profiles.getRecommendedFileFormat(),
+                profiles.getAudioProfiles(),
+                validVideoProfiles
+        );
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProvider.java
new file mode 100644
index 0000000..df32c6d
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProvider.java
@@ -0,0 +1,74 @@
+/*
+ * 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.impl;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.quirk.ProfileResolutionQuirk;
+
+import java.util.List;
+
+/**
+ * An implementation that provides the {@link EncoderProfilesProxy} whose video resolutions are
+ * validated.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class ResolutionValidatedEncoderProfilesProvider implements EncoderProfilesProvider {
+
+    private final EncoderProfilesProvider mProvider;
+    private final EncoderProfilesResolutionValidator mEncoderProfilesResolutionValidator;
+
+    public ResolutionValidatedEncoderProfilesProvider(@NonNull EncoderProfilesProvider provider,
+            @NonNull Quirks quirks) {
+        mProvider = provider;
+        List<ProfileResolutionQuirk> resolutionQuirks = quirks.getAll(ProfileResolutionQuirk.class);
+        mEncoderProfilesResolutionValidator = new EncoderProfilesResolutionValidator(
+                resolutionQuirks);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean hasProfile(int quality) {
+        if (!mProvider.hasProfile(quality)) {
+            return false;
+        }
+
+        if (mEncoderProfilesResolutionValidator.hasQuirk()) {
+            EncoderProfilesProxy profiles = mProvider.getAll(quality);
+            return mEncoderProfilesResolutionValidator.hasValidVideoResolution(profiles);
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Nullable
+    @Override
+    public EncoderProfilesProxy getAll(int quality) {
+        if (!mProvider.hasProfile(quality)) {
+            return null;
+        }
+
+        EncoderProfilesProxy profiles = mProvider.getAll(quality);
+        if (mEncoderProfilesResolutionValidator.hasQuirk()) {
+            profiles = mEncoderProfilesResolutionValidator.filterInvalidVideoResolution(profiles);
+        }
+
+        return profiles;
+    }
+}
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/impl/compat/EncoderProfilesProxyCompat.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompat.java
new file mode 100644
index 0000000..a214fe1
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompat.java
@@ -0,0 +1,66 @@
+/*
+ * 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.impl.compat;
+
+import android.media.CamcorderProfile;
+import android.media.EncoderProfiles;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+
+/**
+ * Helper for accessing features of {@link EncoderProfiles} and {@link CamcorderProfile} in a
+ * backwards compatible fashion.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class EncoderProfilesProxyCompat {
+
+    private static final String TAG = "EncoderProfilesProxyCompat";
+
+    /** Creates an EncoderProfilesProxy instance from {@link EncoderProfiles}. */
+    @RequiresApi(31)
+    @NonNull
+    public static EncoderProfilesProxy from(@NonNull EncoderProfiles encoderProfiles) {
+        if (Build.VERSION.SDK_INT >= 33) {
+            return EncoderProfilesProxyCompatApi33Impl.from(encoderProfiles);
+        } else if (Build.VERSION.SDK_INT >= 31) {
+            return EncoderProfilesProxyCompatApi31Impl.from(encoderProfiles);
+        } else {
+            throw new RuntimeException(
+                    "Unable to call from(EncoderProfiles) on API " + Build.VERSION.SDK_INT
+                            + ". Version 31 or higher required.");
+        }
+    }
+
+    /** Creates an EncoderProfilesProxy instance from {@link CamcorderProfile}. */
+    @NonNull
+    public static EncoderProfilesProxy from(@NonNull CamcorderProfile camcorderProfile) {
+        if (Build.VERSION.SDK_INT >= 31) {
+            Logger.w(TAG, "Should use from(EncoderProfiles) on API " + Build.VERSION.SDK_INT
+                    + "instead. CamcorderProfile is deprecated on API 31.");
+        }
+
+        return EncoderProfilesProxyCompatBaseImpl.from(camcorderProfile);
+    }
+
+    // Class should not be instantiated.
+    private EncoderProfilesProxyCompat() {
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi31Impl.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi31Impl.java
new file mode 100644
index 0000000..57a5476
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi31Impl.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.impl.compat;
+
+import android.media.EncoderProfiles;
+import android.media.EncoderProfiles.AudioProfile;
+import android.media.EncoderProfiles.VideoProfile;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.ImmutableEncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiresApi(31)
+class EncoderProfilesProxyCompatApi31Impl {
+
+    /** Creates an EncoderProfilesProxy instance from {@link EncoderProfiles}. */
+    @NonNull
+    public static EncoderProfilesProxy from(
+            @NonNull EncoderProfiles encoderProfiles) {
+        return ImmutableEncoderProfilesProxy.create(
+                encoderProfiles.getDefaultDurationSeconds(),
+                encoderProfiles.getRecommendedFileFormat(),
+                fromAudioProfiles(encoderProfiles.getAudioProfiles()),
+                fromVideoProfiles(encoderProfiles.getVideoProfiles())
+        );
+    }
+
+    /** Creates VideoProfileProxy instances from a list of {@link VideoProfile}. */
+    @NonNull
+    private static List<VideoProfileProxy> fromVideoProfiles(
+            @NonNull List<VideoProfile> profiles) {
+        List<VideoProfileProxy> proxies = new ArrayList<>();
+        for (VideoProfile profile : profiles) {
+            proxies.add(VideoProfileProxy.create(
+                    profile.getCodec(),
+                    profile.getMediaType(),
+                    profile.getBitrate(),
+                    profile.getFrameRate(),
+                    profile.getWidth(),
+                    profile.getHeight(),
+                    profile.getProfile(),
+                    VideoProfileProxy.BIT_DEPTH_8,
+                    VideoProfile.YUV_420,
+                    VideoProfile.HDR_NONE
+            ));
+        }
+        return proxies;
+    }
+
+    /** Creates AudioProfileProxy instances from a list of {@link AudioProfile}. */
+    @NonNull
+    private static List<AudioProfileProxy> fromAudioProfiles(
+            @NonNull List<AudioProfile> profiles) {
+        List<AudioProfileProxy> proxies = new ArrayList<>();
+        for (AudioProfile profile : profiles) {
+            proxies.add(AudioProfileProxy.create(
+                    profile.getCodec(),
+                    profile.getMediaType(),
+                    profile.getBitrate(),
+                    profile.getSampleRate(),
+                    profile.getChannels(),
+                    profile.getProfile()
+            ));
+        }
+        return proxies;
+    }
+
+    // Class should not be instantiated.
+    private EncoderProfilesProxyCompatApi31Impl() {
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi33Impl.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi33Impl.java
new file mode 100644
index 0000000..e69305b
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatApi33Impl.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.impl.compat;
+
+import android.media.EncoderProfiles;
+import android.media.EncoderProfiles.AudioProfile;
+import android.media.EncoderProfiles.VideoProfile;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.ImmutableEncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiresApi(33)
+class EncoderProfilesProxyCompatApi33Impl {
+
+    /** Creates an EncoderProfilesProxy instance from {@link EncoderProfiles}. */
+    @NonNull
+    public static EncoderProfilesProxy from(
+            @NonNull EncoderProfiles encoderProfiles) {
+        return ImmutableEncoderProfilesProxy.create(
+                encoderProfiles.getDefaultDurationSeconds(),
+                encoderProfiles.getRecommendedFileFormat(),
+                fromAudioProfiles(encoderProfiles.getAudioProfiles()),
+                fromVideoProfiles(encoderProfiles.getVideoProfiles())
+        );
+    }
+
+    /** Creates VideoProfileProxy instances from a list of {@link VideoProfile}. */
+    @NonNull
+    private static List<VideoProfileProxy> fromVideoProfiles(
+            @NonNull List<VideoProfile> profiles) {
+        List<VideoProfileProxy> proxies = new ArrayList<>();
+        for (VideoProfile profile : profiles) {
+            proxies.add(VideoProfileProxy.create(
+                    profile.getCodec(),
+                    profile.getMediaType(),
+                    profile.getBitrate(),
+                    profile.getFrameRate(),
+                    profile.getWidth(),
+                    profile.getHeight(),
+                    profile.getProfile(),
+                    profile.getBitDepth(),
+                    profile.getChromaSubsampling(),
+                    profile.getHdrFormat()
+            ));
+        }
+        return proxies;
+    }
+
+    /** Creates AudioProfileProxy instances from a list of {@link AudioProfile}. */
+    @NonNull
+    private static List<AudioProfileProxy> fromAudioProfiles(
+            @NonNull List<AudioProfile> profiles) {
+        List<AudioProfileProxy> proxies = new ArrayList<>();
+        for (AudioProfile profile : profiles) {
+            proxies.add(AudioProfileProxy.create(
+                    profile.getCodec(),
+                    profile.getMediaType(),
+                    profile.getBitrate(),
+                    profile.getSampleRate(),
+                    profile.getChannels(),
+                    profile.getProfile()
+            ));
+        }
+        return proxies;
+    }
+
+    // Class should not be instantiated.
+    private EncoderProfilesProxyCompatApi33Impl() {
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatBaseImpl.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatBaseImpl.java
new file mode 100644
index 0000000..7e4b830
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/compat/EncoderProfilesProxyCompatBaseImpl.java
@@ -0,0 +1,197 @@
+/*
+ * 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.impl.compat;
+
+import static android.media.MediaRecorder.AudioEncoder.AAC;
+import static android.media.MediaRecorder.AudioEncoder.AAC_ELD;
+import static android.media.MediaRecorder.AudioEncoder.AMR_NB;
+import static android.media.MediaRecorder.AudioEncoder.AMR_WB;
+import static android.media.MediaRecorder.AudioEncoder.HE_AAC;
+import static android.media.MediaRecorder.AudioEncoder.OPUS;
+import static android.media.MediaRecorder.AudioEncoder.VORBIS;
+import static android.media.MediaRecorder.VideoEncoder.AV1;
+import static android.media.MediaRecorder.VideoEncoder.DOLBY_VISION;
+import static android.media.MediaRecorder.VideoEncoder.H263;
+import static android.media.MediaRecorder.VideoEncoder.H264;
+import static android.media.MediaRecorder.VideoEncoder.HEVC;
+import static android.media.MediaRecorder.VideoEncoder.MPEG_4_SP;
+import static android.media.MediaRecorder.VideoEncoder.VP8;
+import static android.media.MediaRecorder.VideoEncoder.VP9;
+
+import android.media.CamcorderProfile;
+import android.media.EncoderProfiles;
+import android.media.MediaCodecInfo;
+import android.media.MediaFormat;
+import android.media.MediaRecorder;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.ImmutableEncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+class EncoderProfilesProxyCompatBaseImpl {
+
+    /** Creates an EncoderProfilesProxy instance from {@link CamcorderProfile}. */
+    @NonNull
+    public static EncoderProfilesProxy from(
+            @NonNull CamcorderProfile camcorderProfile) {
+        return ImmutableEncoderProfilesProxy.create(
+                camcorderProfile.duration,
+                camcorderProfile.fileFormat,
+                toAudioProfiles(camcorderProfile),
+                toVideoProfiles(camcorderProfile)
+        );
+    }
+
+    /** Creates VideoProfileProxy instances from {@link CamcorderProfile}. */
+    @NonNull
+    private static List<VideoProfileProxy> toVideoProfiles(
+            @NonNull CamcorderProfile camcorderProfile) {
+        List<VideoProfileProxy> proxies = new ArrayList<>();
+        proxies.add(VideoProfileProxy.create(
+                camcorderProfile.videoCodec,
+                getVideoCodecMimeType(camcorderProfile.videoCodec),
+                camcorderProfile.videoBitRate,
+                camcorderProfile.videoFrameRate,
+                camcorderProfile.videoFrameWidth,
+                camcorderProfile.videoFrameHeight,
+                EncoderProfilesProxy.CODEC_PROFILE_NONE,
+                VideoProfileProxy.BIT_DEPTH_8,
+                EncoderProfiles.VideoProfile.YUV_420,
+                EncoderProfiles.VideoProfile.HDR_NONE
+        ));
+        return proxies;
+    }
+
+    /** Creates AudioProfileProxy instances from {@link CamcorderProfile}. */
+    @NonNull
+    private static List<AudioProfileProxy> toAudioProfiles(
+            @NonNull CamcorderProfile camcorderProfile) {
+        List<AudioProfileProxy> proxies = new ArrayList<>();
+        proxies.add(AudioProfileProxy.create(
+                camcorderProfile.audioCodec,
+                getAudioCodecMimeType(camcorderProfile.audioCodec),
+                camcorderProfile.audioBitRate,
+                camcorderProfile.audioSampleRate,
+                camcorderProfile.audioChannels,
+                getRequiredAudioProfile(camcorderProfile.audioCodec)
+        ));
+        return proxies;
+    }
+
+    /**
+     * Returns a mime-type string for the given video codec type.
+     *
+     * @return A mime-type string or {@link VideoProfileProxy#MEDIA_TYPE_NONE} if the codec type is
+     * {@link MediaRecorder.VideoEncoder#DEFAULT}, as this type is under-defined and cannot be
+     * resolved to a specific mime type without more information.
+     */
+    @NonNull
+    private static String getVideoCodecMimeType(
+            @VideoProfileProxy.VideoEncoder int codec) {
+        switch (codec) {
+            // Mime-type definitions taken from
+            // frameworks/av/media/libstagefright/foundation/MediaDefs.cpp
+            case H263:
+                return MediaFormat.MIMETYPE_VIDEO_H263;
+            case H264:
+                return MediaFormat.MIMETYPE_VIDEO_AVC;
+            case HEVC:
+                return MediaFormat.MIMETYPE_VIDEO_HEVC;
+            case VP8:
+                return MediaFormat.MIMETYPE_VIDEO_VP8;
+            case MPEG_4_SP:
+                return MediaFormat.MIMETYPE_VIDEO_MPEG4;
+            case VP9:
+                return MediaFormat.MIMETYPE_VIDEO_VP9;
+            case DOLBY_VISION:
+                return MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION;
+            case AV1:
+                return MediaFormat.MIMETYPE_VIDEO_AV1;
+            case MediaRecorder.VideoEncoder.DEFAULT:
+                break;
+        }
+
+        return VideoProfileProxy.MEDIA_TYPE_NONE;
+    }
+
+    /**
+     * Returns a mime-type string for the given audio codec type.
+     *
+     * @return A mime-type string or {@link AudioProfileProxy#MEDIA_TYPE_NONE} if the codec type is
+     * {@link android.media.MediaRecorder.AudioEncoder#DEFAULT}, as this type is under-defined
+     * and cannot be resolved to a specific mime type without more information.
+     */
+    @NonNull
+    private static String getAudioCodecMimeType(@AudioProfileProxy.AudioEncoder int codec) {
+        // Mime-type definitions taken from
+        // frameworks/av/media/libstagefright/foundation/MediaDefs.cpp
+        switch (codec) {
+            case AAC: // Should use aac-profile LC
+            case HE_AAC: // Should use aac-profile HE
+            case AAC_ELD: // Should use aac-profile ELD
+                return MediaFormat.MIMETYPE_AUDIO_AAC;
+            case AMR_NB:
+                return MediaFormat.MIMETYPE_AUDIO_AMR_NB;
+            case AMR_WB:
+                return MediaFormat.MIMETYPE_AUDIO_AMR_WB;
+            case OPUS:
+                return MediaFormat.MIMETYPE_AUDIO_OPUS;
+            case VORBIS:
+                return MediaFormat.MIMETYPE_AUDIO_VORBIS;
+            case MediaRecorder.AudioEncoder.DEFAULT:
+                break;
+        }
+
+        return AudioProfileProxy.MEDIA_TYPE_NONE;
+    }
+
+    /**
+     * Returns the required audio profile for the given audio encoder.
+     *
+     * <p>For example, this can be used to differentiate between AAC encoders
+     * {@link android.media.MediaRecorder.AudioEncoder#AAC},
+     * {@link android.media.MediaRecorder.AudioEncoder#AAC_ELD},
+     * and {@link android.media.MediaRecorder.AudioEncoder#HE_AAC}.
+     * Should be used with the {@link MediaCodecInfo.CodecProfileLevel#profile} field.
+     *
+     * @return The profile required by the audio codec. If no profile is required, returns
+     * {@link EncoderProfilesProxy#CODEC_PROFILE_NONE}.
+     */
+    private static int getRequiredAudioProfile(@AudioProfileProxy.AudioEncoder int codec) {
+        switch (codec) {
+            case AAC:
+                return MediaCodecInfo.CodecProfileLevel.AACObjectLC;
+            case AAC_ELD:
+                return MediaCodecInfo.CodecProfileLevel.AACObjectELD;
+            case HE_AAC:
+                return MediaCodecInfo.CodecProfileLevel.AACObjectHE;
+            default:
+                return EncoderProfilesProxy.CODEC_PROFILE_NONE;
+        }
+    }
+
+    // Class should not be instantiated.
+    private EncoderProfilesProxyCompatBaseImpl() {
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/quirk/ProfileResolutionQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/quirk/ProfileResolutionQuirk.java
new file mode 100644
index 0000000..cdb5a87
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/quirk/ProfileResolutionQuirk.java
@@ -0,0 +1,41 @@
+/*
+ * 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.impl.quirk;
+
+import android.media.EncoderProfiles;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+import java.util.List;
+
+/**
+ * A Quirk interface which denotes that CameraX should validate video resolutions returned from
+ * {@link EncoderProfiles} instead of using them directly.
+ *
+ * <p>Subclasses of this quirk should provide a list of supported resolutions for CameraX to
+ * verify.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface ProfileResolutionQuirk extends Quirk {
+
+    /** Returns a list of supported resolutions. */
+    @NonNull
+    List<Size> getSupportedResolutions();
+}
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 6940b2d..924d3a4 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
@@ -58,7 +58,6 @@
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.camera.core.processing.SurfaceProcessorWithExecutor;
 import androidx.camera.core.streamsharing.StreamSharing;
 import androidx.core.util.Preconditions;
 
@@ -90,13 +89,12 @@
     private final UseCaseConfigFactory mUseCaseConfigFactory;
 
     private static final String TAG = "CameraUseCaseAdapter";
-    private boolean mStreamSharingEnabled = false;
 
     private final CameraId mId;
 
     // UseCases from the app. This does not include internal UseCases created by CameraX.
     @GuardedBy("mLock")
-    private final List<UseCase> mUseCases = new ArrayList<>();
+    private final List<UseCase> mAppUseCases = new ArrayList<>();
     // UseCases sent to the camera including internal UseCases created by CameraX.
     @GuardedBy("mLock")
     private final List<UseCase> mCameraUseCases = new ArrayList<>();
@@ -206,12 +204,12 @@
      */
     public void addUseCases(@NonNull Collection<UseCase> appUseCasesToAdd) throws CameraException {
         synchronized (mLock) {
-            List<UseCase> appUseCasesAfter = new ArrayList<>(mUseCases);
+            List<UseCase> appUseCases = new ArrayList<>(mAppUseCases);
             // Removing new from existing to avoid duplicate UseCases.
-            appUseCasesAfter.removeAll(appUseCasesToAdd);
-            appUseCasesAfter.addAll(appUseCasesToAdd);
+            appUseCases.removeAll(appUseCasesToAdd);
+            appUseCases.addAll(appUseCasesToAdd);
             try {
-                updateUseCases(appUseCasesAfter);
+                updateUseCases(appUseCases);
             } catch (IllegalArgumentException e) {
                 throw new CameraException(e.getMessage());
             }
@@ -223,9 +221,9 @@
      */
     public void removeUseCases(@NonNull Collection<UseCase> useCasesToRemove) {
         synchronized (mLock) {
-            List<UseCase> appUseCasesAfter = new ArrayList<>(mUseCases);
-            appUseCasesAfter.removeAll(useCasesToRemove);
-            updateUseCases(appUseCasesAfter);
+            List<UseCase> appUseCases = new ArrayList<>(mAppUseCases);
+            appUseCases.removeAll(useCasesToRemove);
+            updateUseCases(appUseCases);
         }
     }
 
@@ -242,7 +240,7 @@
      *
      * <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.
@@ -279,7 +277,7 @@
                 //  resolution. Throw exception here if (applyStreamSharing == false), both video
                 //  and preview are used and preview resolution is lower than user configuration.
             } catch (IllegalArgumentException exception) {
-                if (!applyStreamSharing && mStreamSharingEnabled && hasNoExtension()) {
+                if (!applyStreamSharing && hasNoExtension()) {
                     // Try again and see if StreamSharing resolves the issue.
                     updateUseCases(appUseCases, /*applyStreamSharing*/true);
                     return;
@@ -318,8 +316,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;
@@ -400,7 +398,7 @@
     @NonNull
     public List<UseCase> getUseCases() {
         synchronized (mLock) {
-            return new ArrayList<>(mUseCases);
+            return new ArrayList<>(mAppUseCases);
         }
     }
 
@@ -423,12 +421,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();
                 }
 
@@ -459,7 +457,7 @@
     public void detachUseCases() {
         synchronized (mLock) {
             if (mAttached) {
-                mCameraInternal.detachUseCases(new ArrayList<>(mUseCases));
+                mCameraInternal.detachUseCases(new ArrayList<>(mCameraUseCases));
                 cacheInteropConfig();
                 mAttached = false;
             }
@@ -546,18 +544,9 @@
         // Set effects on the UseCases. This also removes existing effects if necessary.
         for (UseCase useCase : useCases) {
             if (useCase instanceof Preview) {
-                Preview preview = ((Preview) useCase);
-                CameraEffect effect = effectsByTargets.get(CameraEffect.PREVIEW);
-                if (effect == null) {
-                    preview.setProcessor(null);
-                    continue;
-                }
-                preview.setProcessor(new SurfaceProcessorWithExecutor(
-                        requireNonNull(effect.getSurfaceProcessor()),
-                        effect.getExecutor()));
+                useCase.setEffect(effectsByTargets.get(CameraEffect.PREVIEW));
             } else if (useCase instanceof ImageCapture) {
-                ImageCapture imageCapture = ((ImageCapture) useCase);
-                imageCapture.setEffect(effectsByTargets.get(CameraEffect.IMAGE_CAPTURE));
+                useCase.setEffect(effectsByTargets.get(CameraEffect.IMAGE_CAPTURE));
             }
         }
     }
@@ -724,7 +713,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");
@@ -870,9 +859,4 @@
     private ImageCapture createExtraImageCapture() {
         return new ImageCapture.Builder().setTargetName("ImageCapture-Extra").build();
     }
-
-    @VisibleForTesting
-    void setStreamSharingEnabled(boolean streamSharingEnabled) {
-        mStreamSharingEnabled = streamSharingEnabled;
-    }
 }
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/streamsharing/StreamSharing.java b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/StreamSharing.java
index f6bc6c4..54f0b6a 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
@@ -180,7 +180,7 @@
                 getSensorToBufferTransformMatrix(),
                 getHasCameraTransform(),
                 requireNonNull(getCropRect(streamSpec.getResolution())),
-                getRelativeRotation(camera),
+                /*rotationDegrees=*/0, // Rotation are handled by each child.
                 /*mirroring=*/false); // Mirroring will be decided by each child.
         mNode = new SurfaceProcessorNode(camera, DefaultSurfaceProcessor.Factory.newInstance());
 
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 a08de59..667b674 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
@@ -165,7 +165,7 @@
             //  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;
+            boolean mirroring = useCase instanceof Preview && isFrontFacing();
             outConfigs.put(useCase, OutConfig.of(
                     target,
                     cameraEdge.getCropRect(),
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
index 122860b..e1271ec 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
@@ -39,7 +39,6 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.core.internal.utils.SizeUtil
-import androidx.camera.core.processing.SurfaceProcessorInternal
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
@@ -47,6 +46,7 @@
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.test.core.app.ApplicationProvider
@@ -75,7 +75,7 @@
 )
 class PreviewTest {
 
-    var cameraUseCaseAdapter: CameraUseCaseAdapter? = null
+    private var cameraUseCaseAdapter: CameraUseCaseAdapter? = null
 
     private lateinit var appSurface: Surface
     private lateinit var appSurfaceTexture: SurfaceTexture
@@ -84,6 +84,8 @@
     private lateinit var cameraXConfig: CameraXConfig
     private lateinit var context: Context
     private lateinit var previewToDetach: Preview
+    private lateinit var processor: FakeSurfaceProcessorInternal
+    private lateinit var effect: CameraEffect
 
     @Before
     @Throws(ExecutionException::class, InterruptedException::class)
@@ -109,6 +111,8 @@
         ).setCameraFactoryProvider(cameraFactoryProvider).build()
         context = ApplicationProvider.getApplicationContext<Context>()
         CameraXUtil.initialize(context, cameraXConfig).get()
+        processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
+        effect = FakeSurfaceEffect(processor)
     }
 
     @After
@@ -123,6 +127,7 @@
         if (::previewToDetach.isInitialized) {
             previewToDetach.onUnbind()
         }
+        processor.release()
         CameraXUtil.shutdown().get()
     }
 
@@ -233,11 +238,10 @@
     @Test
     fun createSurfaceRequestWithProcessor_noCameraTransform() {
         // Arrange: attach Preview without a SurfaceProvider.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
         var transformationInfo: TransformationInfo? = null
 
         // Act: create pipeline in Preview and provide Surface.
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         preview.mCurrentSurfaceRequest!!.setTransformationInfoListener(mainThreadExecutor()) {
             transformationInfo = it
         }
@@ -265,31 +269,24 @@
 
     @Test
     fun backCameraWithProcessor_notMirrored() {
-        // Arrange.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
         // Act: create pipeline
-        val preview = createPreview(processor, backCamera)
+        val preview = createPreview(effect, backCamera)
         // Assert
         assertThat(preview.cameraEdge.mirroring).isFalse()
     }
 
     @Test
     fun frontCameraWithProcessor_mirrored() {
-        // Arrange.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
         // Act: create pipeline
-        val preview = createPreview(processor, frontCamera)
+        val preview = createPreview(effect, frontCamera)
         // Assert
         assertThat(preview.cameraEdge.mirroring).isTrue()
     }
 
     @Test
     fun setTargetRotationWithProcessor_rotationChangesOnSurfaceEdge() {
-        // Arrange.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
-
         // Act: create pipeline
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         // Act: update target rotation
         preview.targetRotation = Surface.ROTATION_0
         shadowOf(getMainLooper()).idle()
@@ -306,8 +303,7 @@
     @Test
     fun invalidateAppSurfaceRequestWithProcessing_cameraNotReset() {
         // Arrange: create Preview with processing.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor(), false)
-        val surfaceRequest = createPreview(processor).mCurrentSurfaceRequest
+        val surfaceRequest = createPreview(effect).mCurrentSurfaceRequest
         // Act: invalidate.
         surfaceRequest!!.invalidate()
         shadowOf(getMainLooper()).idle()
@@ -318,8 +314,7 @@
     @Test
     fun invalidateNodeSurfaceRequest_cameraReset() {
         // Arrange: create Preview with processing.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor(), false)
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         // Act: invalidate.
         processor.surfaceRequest!!.invalidate()
         shadowOf(getMainLooper()).idle()
@@ -342,8 +337,7 @@
     @Test
     fun invalidateWhenDetached_deferrableSurfaceClosed() {
         // Arrange: create Preview with processing then detach.
-        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor(), false)
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         val surfaceRequest = processor.surfaceRequest!!
         preview.unbindFromCamera(backCamera)
         // Act: invalidate.
@@ -355,11 +349,38 @@
     }
 
     @Test
+    fun hasCameraTransform_rotationDegreesNotFlipped() {
+        // Act: create preview with hasCameraTransform == true
+        val preview = createPreview(
+            effect,
+            frontCamera,
+            targetRotation = Surface.ROTATION_90
+        )
+        assertThat(preview.cameraEdge.hasCameraTransform()).isTrue()
+        // Assert: rotationDegrees is not flipped.
+        assertThat(preview.cameraEdge.rotationDegrees).isEqualTo(90)
+    }
+
+    @Test
+    fun noCameraTransform_rotationDegreesFlipped() {
+        // Act: create preview with hasCameraTransform == false
+        val preview = createPreview(
+            effect,
+            frontCamera,
+            hasCameraTransform = false,
+            targetRotation = Surface.ROTATION_90
+        )
+        // Assert: rotationDegrees is flipped
+        assertThat(preview.cameraEdge.rotationDegrees).isEqualTo(270)
+    }
+
+    @Test
     fun setNoCameraTransform_propagatesToCameraEdge() {
         // Act: create preview with hasCameraTransform == false
         val preview = createPreview(
-            FakeSurfaceProcessorInternal(mainThreadExecutor()),
-            hasCameraTransform = false
+            effect,
+            hasCameraTransform = false,
+            targetRotation = Surface.ROTATION_90
         )
         // Assert
         assertThat(preview.cameraEdge.hasCameraTransform()).isFalse()
@@ -370,9 +391,10 @@
     fun frontCameraWithoutCameraTransform_noMirroring() {
         // Act: create preview with hasCameraTransform == false
         val preview = createPreview(
-            FakeSurfaceProcessorInternal(mainThreadExecutor()),
+            effect,
             frontCamera,
-            hasCameraTransform = false
+            hasCameraTransform = false,
+            targetRotation = Surface.ROTATION_90
         )
         // Assert
         assertThat(preview.cameraEdge.mirroring).isFalse()
@@ -380,23 +402,13 @@
 
     @Test
     fun cameraEdgeHasTransformByDefault() {
-        assertThat(
-            createPreview(
-                FakeSurfaceProcessorInternal(mainThreadExecutor())
-            ).cameraEdge.hasCameraTransform()
-        ).isTrue()
+        assertThat(createPreview(effect).cameraEdge.hasCameraTransform()).isTrue()
     }
 
     @Test
     fun bindAndUnbindPreview_surfacesPropagated() {
-        // Arrange.
-        val processor = FakeSurfaceProcessorInternal(
-            mainThreadExecutor(),
-            false
-        )
-
         // Act: create pipeline in Preview and provide Surface.
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         val surfaceRequest = preview.mCurrentSurfaceRequest!!
         var appSurfaceReadyToRelease = false
         surfaceRequest.provideSurface(appSurface, mainThreadExecutor()) {
@@ -422,21 +434,13 @@
         assertThat(processor.isReleased).isTrue()
         assertThat(processor.isOutputSurfaceRequestedToClose[PREVIEW]).isTrue()
         assertThat(processor.isInputSurfaceReleased).isTrue()
-        assertThat(appSurfaceReadyToRelease).isFalse()
-
-        // Act: close SurfaceOutput
-        processor.surfaceOutputs[CameraEffect.PREVIEW]!!.close()
-        shadowOf(getMainLooper()).idle()
         assertThat(appSurfaceReadyToRelease).isTrue()
     }
 
     @Test
     fun invokedErrorListener_recreatePipeline() {
         // Arrange: create pipeline and get a reference of the SessionConfig.
-        val processor = FakeSurfaceProcessorInternal(
-            mainThreadExecutor()
-        )
-        val preview = createPreview(processor)
+        val preview = createPreview(effect)
         val originalSessionConfig = preview.sessionConfig
 
         // Act: invoke the error listener.
@@ -638,15 +642,16 @@
     }
 
     private fun createPreview(
-        surfaceProcessor: SurfaceProcessorInternal? = null,
+        effect: CameraEffect? = null,
         camera: FakeCamera = backCamera,
-        hasCameraTransform: Boolean = true
+        hasCameraTransform: Boolean = true,
+        targetRotation: Int = Surface.ROTATION_0
     ): Preview {
         previewToDetach = Preview.Builder()
-            .setTargetRotation(Surface.ROTATION_0)
+            .setTargetRotation(targetRotation)
             .build()
         previewToDetach.hasCameraTransform = hasCameraTransform
-        previewToDetach.processor = surfaceProcessor
+        previewToDetach.effect = effect
         previewToDetach.setSurfaceProvider(CameraXExecutors.directExecutor()) {}
         val previewConfig = PreviewConfig(
             cameraXConfig.getUseCaseConfigFactoryProvider(null)!!.newInstance(context).getConfig(
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/UseCaseGroupTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/UseCaseGroupTest.kt
index 035cbfa0..7d877d1 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/UseCaseGroupTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/UseCaseGroupTest.kt
@@ -22,7 +22,7 @@
 import androidx.camera.core.CameraEffect.VIDEO_CAPTURE
 import androidx.camera.core.UseCaseGroup.Builder.getHumanReadableTargets
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.camera.testing.fakes.FakePreviewEffect
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.camera.testing.fakes.FakeUseCase
 import com.google.common.truth.Truth.assertThat
@@ -43,7 +43,7 @@
     @Test
     fun duplicateTargets_throwsException() {
         // Arrange.
-        val previewEffect = FakePreviewEffect(
+        val previewEffect = FakeSurfaceEffect(
             CameraXExecutors.mainThreadExecutor(),
             FakeSurfaceProcessor(CameraXExecutors.mainThreadExecutor())
         )
@@ -61,8 +61,8 @@
 
         // Assert.
         assertThat(message).isEqualTo(
-            "Effects androidx.camera.testing.fakes.FakePreviewEffect " +
-                "and androidx.camera.testing.fakes.FakePreviewEffect " +
+            "Effects androidx.camera.testing.fakes.FakeSurfaceEffect " +
+                "and androidx.camera.testing.fakes.FakeSurfaceEffect " +
                 "contain duplicate targets PREVIEW."
         )
     }
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInternalTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInternalTest.kt
new file mode 100644
index 0000000..eb693ac
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInternalTest.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.camera.core.impl
+
+import android.os.Build
+import androidx.camera.core.CameraSelector
+import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import com.google.common.truth.Truth.assertThat
+
+/**
+ * Unit tests for [CameraInternal].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class CameraInternalTest {
+
+    @Test
+    fun frontCamera_isFacingFront() {
+        val camera = FakeCamera(null, FakeCameraInfoInternal(0, CameraSelector.LENS_FACING_FRONT))
+        assertThat(camera.isFrontFacing).isTrue()
+    }
+
+    @Test
+    fun backCamera_isFacingBack() {
+        val camera = FakeCamera(null, FakeCameraInfoInternal(0, CameraSelector.LENS_FACING_BACK))
+        assertThat(camera.isFrontFacing).isFalse()
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/EncoderProfilesResolutionValidatorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/EncoderProfilesResolutionValidatorTest.kt
new file mode 100644
index 0000000..57b9338
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/EncoderProfilesResolutionValidatorTest.kt
@@ -0,0 +1,76 @@
+/*
+ * 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.impl
+
+import android.os.Build
+import android.util.Size
+import androidx.camera.core.impl.quirk.ProfileResolutionQuirk
+import androidx.camera.testing.EncoderProfilesUtil
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class EncoderProfilesResolutionValidatorTest {
+
+    @Test
+    fun noQuirk_alwaysValid() {
+        val validator = EncoderProfilesResolutionValidator(null)
+
+        assertThat(validator.hasValidVideoResolution(EncoderProfilesUtil.PROFILES_2160P)).isTrue()
+        assertThat(validator.hasValidVideoResolution(EncoderProfilesUtil.PROFILES_720P)).isTrue()
+    }
+
+    @Test
+    fun hasQuirk_shouldCheckSupportedResolutions() {
+        val quirk = createFakeProfileResolutionQuirk(
+            supportedResolution = arrayOf(EncoderProfilesUtil.RESOLUTION_2160P)
+        )
+        val validator = EncoderProfilesResolutionValidator(listOf(quirk))
+
+        assertThat(validator.hasValidVideoResolution(EncoderProfilesUtil.PROFILES_2160P)).isTrue()
+        assertThat(validator.hasValidVideoResolution(EncoderProfilesUtil.PROFILES_720P)).isFalse()
+    }
+
+    @Test
+    fun nullProfile_notValid() {
+        val quirk = createFakeProfileResolutionQuirk(
+            supportedResolution = arrayOf(EncoderProfilesUtil.RESOLUTION_2160P)
+        )
+        val validator = EncoderProfilesResolutionValidator(listOf(quirk))
+
+        assertThat(validator.hasValidVideoResolution(null)).isFalse()
+    }
+
+    private fun createFakeProfileResolutionQuirk(
+        supportedResolution: Array<Size> = emptyArray()
+    ): ProfileResolutionQuirk {
+        return FakeQuirk(supportedResolution)
+    }
+
+    class FakeQuirk(private val supportedResolutions: Array<Size>) : ProfileResolutionQuirk {
+
+        override fun getSupportedResolutions(): MutableList<Size> {
+            return supportedResolutions.toMutableList()
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProviderTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProviderTest.kt
new file mode 100644
index 0000000..198bc4c
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/ResolutionValidatedEncoderProfilesProviderTest.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.camera.core.impl
+
+import android.media.CamcorderProfile.QUALITY_1080P
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_480P
+import android.media.CamcorderProfile.QUALITY_720P
+import android.os.Build
+import android.util.Size
+import androidx.camera.core.impl.quirk.ProfileResolutionQuirk
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_1080P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_2160P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_480P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_720P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_1080P
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+private val PAIR_2160 = Pair(QUALITY_2160P, PROFILES_2160P)
+private val PAIR_1080 = Pair(QUALITY_1080P, PROFILES_1080P)
+private val PAIR_720 = Pair(QUALITY_720P, PROFILES_720P)
+private val PAIR_480 = Pair(QUALITY_480P, PROFILES_480P)
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class ResolutionValidatedEncoderProfilesProviderTest {
+
+    private val defaultProvider = createFakeEncoderProfilesProvider(
+        arrayOf(PAIR_2160, PAIR_1080, PAIR_720, PAIR_480)
+    )
+
+    @Test
+    fun hasNoProfile_canNotGetProfiles() {
+        val quirks = createQuirksWithProfileResolutionQuirk(
+            supportedResolution = arrayOf(RESOLUTION_1080P)
+        )
+        val emptyProvider = createFakeEncoderProfilesProvider()
+        val provider = ResolutionValidatedEncoderProfilesProvider(emptyProvider, quirks)
+
+        assertThat(provider.hasProfile(QUALITY_2160P)).isFalse()
+        assertThat(provider.hasProfile(QUALITY_1080P)).isFalse()
+        assertThat(provider.hasProfile(QUALITY_720P)).isFalse()
+        assertThat(provider.hasProfile(QUALITY_480P)).isFalse()
+        assertThat(provider.getAll(QUALITY_2160P)).isNull()
+        assertThat(provider.getAll(QUALITY_1080P)).isNull()
+        assertThat(provider.getAll(QUALITY_720P)).isNull()
+        assertThat(provider.getAll(QUALITY_480P)).isNull()
+    }
+
+    @Test
+    fun hasQuirk_canOnlyGetSupportedProfiles() {
+        val quirks = createQuirksWithProfileResolutionQuirk(
+            supportedResolution = arrayOf(RESOLUTION_1080P)
+        )
+        val provider = ResolutionValidatedEncoderProfilesProvider(defaultProvider, quirks)
+
+        assertThat(provider.hasProfile(QUALITY_2160P)).isFalse()
+        assertThat(provider.hasProfile(QUALITY_1080P)).isTrue()
+        assertThat(provider.hasProfile(QUALITY_720P)).isFalse()
+        assertThat(provider.hasProfile(QUALITY_480P)).isFalse()
+        assertThat(provider.getAll(QUALITY_2160P)).isNull()
+        assertThat(provider.getAll(QUALITY_1080P)).isNotNull()
+        assertThat(provider.getAll(QUALITY_720P)).isNull()
+        assertThat(provider.getAll(QUALITY_480P)).isNull()
+    }
+
+    @Test
+    fun hasNoQuirk_canGetProfiles() {
+        val quirks = Quirks(emptyList())
+        val provider = ResolutionValidatedEncoderProfilesProvider(defaultProvider, quirks)
+
+        assertThat(provider.hasProfile(QUALITY_2160P)).isTrue()
+        assertThat(provider.hasProfile(QUALITY_1080P)).isTrue()
+        assertThat(provider.hasProfile(QUALITY_720P)).isTrue()
+        assertThat(provider.hasProfile(QUALITY_480P)).isTrue()
+        assertThat(provider.getAll(QUALITY_2160P)).isNotNull()
+        assertThat(provider.getAll(QUALITY_1080P)).isNotNull()
+        assertThat(provider.getAll(QUALITY_720P)).isNotNull()
+        assertThat(provider.getAll(QUALITY_480P)).isNotNull()
+    }
+
+    private fun createFakeEncoderProfilesProvider(
+        qualityToProfilesPairs: Array<Pair<Int, EncoderProfilesProxy>> = emptyArray()
+    ): EncoderProfilesProvider {
+        return FakeEncoderProfilesProvider.Builder().also { builder ->
+            for (pair in qualityToProfilesPairs) {
+                builder.add(pair.first, pair.second)
+            }
+        }.build()
+    }
+
+    private fun createQuirksWithProfileResolutionQuirk(
+        supportedResolution: Array<Size> = emptyArray()
+    ): Quirks {
+        return Quirks(listOf(FakeQuirk(supportedResolution)))
+    }
+
+    class FakeQuirk(private val supportedResolutions: Array<Size>) : ProfileResolutionQuirk {
+
+        override fun getSupportedResolutions(): MutableList<Size> {
+            return supportedResolutions.toMutableList()
+        }
+    }
+}
\ No newline at end of file
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 74c6185..b8e92f5 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
@@ -41,11 +41,10 @@
 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.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.testing.fakes.FakeUseCase
@@ -88,6 +87,7 @@
     private lateinit var fakeCameraDeviceSurfaceManager: FakeCameraDeviceSurfaceManager
     private lateinit var fakeCamera: FakeCamera
     private lateinit var useCaseConfigFactory: UseCaseConfigFactory
+    private lateinit var previewEffect: FakeSurfaceEffect
     private val fakeCameraSet = LinkedHashSet<CameraInternal>()
     private val imageEffect = GrayscaleImageEffect()
     private val preview = Preview.Builder().build()
@@ -104,7 +104,11 @@
         fakeCameraSet.add(fakeCamera)
         surfaceProcessor = FakeSurfaceProcessor(mainThreadExecutor())
         executor = Executors.newSingleThreadExecutor()
-        effects = listOf(FakePreviewEffect(executor, surfaceProcessor), imageEffect)
+        previewEffect = FakeSurfaceEffect(
+            executor,
+            surfaceProcessor
+        )
+        effects = listOf(previewEffect, imageEffect)
         adapter = CameraUseCaseAdapter(
             fakeCameraSet,
             fakeCameraDeviceSurfaceManager,
@@ -119,12 +123,24 @@
         executor.shutdown()
     }
 
-    // TODO(b/264936606): test UseCases bind()/unbind() are called correctly.
+    @Test
+    fun attachAndDetachUseCases_cameraUseCasesAttachedAndDetached() {
+        // Arrange: bind UseCases that requires sharing.
+        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() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         val streamSharing = StreamSharing(fakeCamera, setOf(preview, video), useCaseConfigFactory)
         // Act: add use cases that can only be supported with StreamSharing
         adapter.addUseCases(setOf(streamSharing, video, image))
@@ -132,8 +148,6 @@
 
     @Test
     fun invalidUseCaseCombo_streamSharingOn() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         // Act: add use cases that can only be supported with StreamSharing
         adapter.addUseCases(setOf(preview, video, image))
         // Assert: StreamSharing is connected to camera.
@@ -153,8 +167,6 @@
 
     @Test
     fun validUseCaseCombo_streamSharingOff() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         // Act: add use cases that do not need StreamSharing
         adapter.addUseCases(setOf(preview, video))
         // Assert: the app UseCase are connected to camera.
@@ -169,7 +181,6 @@
     @Test(expected = CameraException::class)
     fun invalidUseCaseComboCantBeFixedByStreamSharing_throwsException() {
         // Arrange: create a camera that only support one JPEG stream.
-        adapter.setStreamSharingEnabled(true)
         fakeCameraDeviceSurfaceManager.setValidSurfaceCombos(setOf(listOf(JPEG)))
         // Act: add PRIV and JPEG streams.
         adapter.addUseCases(setOf(preview, image))
@@ -177,8 +188,6 @@
 
     @Test
     fun addChildThatRequiresStreamSharing_streamSharingOn() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         // Act: add UseCase that do not need StreamSharing
         adapter.addUseCases(setOf(video, image))
         // Assert.
@@ -208,8 +217,6 @@
 
     @Test
     fun removeChildThatRequiresStreamSharing_streamSharingOff() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         // Act: add UseCases that need StreamSharing.
         adapter.addUseCases(setOf(preview, video, image))
         // Assert: StreamSharing exists and bound.
@@ -242,15 +249,12 @@
     fun extensionEnabled_streamSharingOffAndThrowsException() {
         // Arrange: enable extensions
         adapter.setExtendedConfig(createCoexistingRequiredRuleCameraConfig())
-        adapter.setStreamSharingEnabled(true)
         // Act: add UseCases that require StreamSharing
         adapter.addUseCases(setOf(preview, video, image))
     }
 
     @Test
     fun addAdditionalUseCase_streamSharingReused() {
-        // Arrange.
-        adapter.setStreamSharingEnabled(true)
         // Act: add UseCases that require StreamSharing
         adapter.addUseCases(setOf(preview, video, image))
         // Assert: StreamSharing is used.
@@ -824,17 +828,14 @@
 
         // Act: update use cases with effects.
         CameraUseCaseAdapter.updateEffects(effects, useCases)
-        // Assert: preview has processor wrapped with the right executor.
-        val previewProcessor = preview.processor as SurfaceProcessorWithExecutor
-        assertThat(previewProcessor.processor).isEqualTo(surfaceProcessor)
-        assertThat(previewProcessor.executor).isEqualTo(executor)
-        // Assert: imageCapture has the effect set.
+        // Assert: UseCase have effects
+        assertThat(preview.effect).isEqualTo(previewEffect)
         assertThat(imageCapture.effect).isEqualTo(imageEffect)
 
         // Act: update again with no effects.
         CameraUseCaseAdapter.updateEffects(listOf(), useCases)
         // Assert: use cases no longer has effects.
-        assertThat(preview.processor).isNull()
+        assertThat(preview.effect).isNull()
         assertThat(imageCapture.effect).isNull()
     }
 
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/compat/workaround/OnEnableDisableSessionDurationCheckTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/compat/workaround/OnEnableDisableSessionDurationCheckTest.kt
index dd416ee..515d672 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/compat/workaround/OnEnableDisableSessionDurationCheckTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/compat/workaround/OnEnableDisableSessionDurationCheckTest.kt
@@ -31,7 +31,7 @@
 @SdkSuppress(minSdkVersion = 21)
 class OnEnableDisableSessionDurationCheckTest {
     companion object {
-        const val TOLERANCE = 15L
+        const val TOLERANCE = 60L
     }
 
     @Test
@@ -39,7 +39,7 @@
         // Arrange
         val check = OnEnableDisableSessionDurationCheck(/* enabledMinimumDuration */true)
 
-        val duration = 40L
+        val duration = 80L
         // Act
         val startTime = SystemClock.elapsedRealtime()
         check.onEnableSessionInvoked()
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 38dd3a9..0c38d7a 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -26,16 +26,17 @@
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.Preview
 import androidx.camera.core.UseCaseGroup
+import androidx.camera.core.concurrent.ConcurrentCameraConfig
+import androidx.camera.core.concurrent.SingleCameraConfig
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
-import androidx.camera.core.processing.SurfaceProcessorWithExecutor
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakePreviewEffect
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 import androidx.concurrent.futures.await
@@ -79,7 +80,10 @@
         // Arrange.
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         val surfaceProcessor = FakeSurfaceProcessor(mainThreadExecutor())
-        val effect = FakePreviewEffect(mainThreadExecutor(), surfaceProcessor)
+        val effect = FakeSurfaceEffect(
+            mainThreadExecutor(),
+            surfaceProcessor
+        )
         val preview = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
         val useCaseGroup = UseCaseGroup.Builder().addUseCase(preview).addEffect(effect).build()
 
@@ -92,8 +96,7 @@
             )
 
             // Assert.
-            val useCaseProcessor = (preview.processor as SurfaceProcessorWithExecutor).processor
-            assertThat(useCaseProcessor).isEqualTo(surfaceProcessor)
+            assertThat(preview.effect).isEqualTo(effect)
         }
     }
 
@@ -628,6 +631,114 @@
         // Should not throw exception
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
     }
+
+    @Test
+    fun bindConcurrentCamera_isBound() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+
+        runBlocking(MainScope().coroutineContext) {
+            provider = ProcessCameraProvider.getInstance(context).await()
+            val useCase0 = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
+            val useCase1 = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
+
+            val singleCameraConfig0 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_BACK_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase0)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner0)
+                .build()
+            val singleCameraConfig1 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_FRONT_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase1)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner1)
+                .build()
+
+            val concurrentCameraConfig = ConcurrentCameraConfig.Builder()
+                .setCameraConfigs(listOf(singleCameraConfig0, singleCameraConfig1))
+                .build()
+
+            val concurrentCamera = provider.bindToLifecycle(concurrentCameraConfig)
+
+            assertThat(concurrentCamera).isNotNull()
+            assertThat(concurrentCamera.cameras.size).isEqualTo(2)
+            assertThat(provider.isBound(useCase0)).isTrue()
+            assertThat(provider.isBound(useCase1)).isTrue()
+        }
+    }
+
+    @Test
+    fun bindConcurrentCamera_lessThanTwoSingleCameraConfigs() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+
+        runBlocking(MainScope().coroutineContext) {
+            provider = ProcessCameraProvider.getInstance(context).await()
+            val useCase0 = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
+
+            val singleCameraConfig0 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_BACK_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase0)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner0)
+                .build()
+
+            val concurrentCameraConfig = ConcurrentCameraConfig.Builder()
+                .setCameraConfigs(listOf(singleCameraConfig0))
+                .build()
+
+            assertThrows<IllegalArgumentException> {
+                provider.bindToLifecycle(concurrentCameraConfig)
+            }
+        }
+    }
+
+    @Test
+    fun bindConcurrentCamera_moreThanTwoSingleCameraConfigs() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+
+        runBlocking(MainScope().coroutineContext) {
+            provider = ProcessCameraProvider.getInstance(context).await()
+            val useCase0 = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
+            val useCase1 = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
+
+            val singleCameraConfig0 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_BACK_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase0)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner0)
+                .build()
+
+            val singleCameraConfig1 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_FRONT_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase1)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner1)
+                .build()
+
+            val singleCameraConfig2 = SingleCameraConfig.Builder()
+                .setCameraSelector(CameraSelector.DEFAULT_FRONT_CAMERA)
+                .setUseCaseGroup(UseCaseGroup.Builder()
+                    .addUseCase(useCase0)
+                    .build())
+                .setLifecycleOwner(lifecycleOwner1)
+                .build()
+
+            val concurrentCameraConfig = ConcurrentCameraConfig.Builder()
+                .setCameraConfigs(listOf(singleCameraConfig0,
+                    singleCameraConfig1,
+                    singleCameraConfig2))
+                .build()
+
+            assertThrows<UnsupportedOperationException> {
+                provider.bindToLifecycle(concurrentCameraConfig)
+            }
+        }
+    }
 }
 
 private class TestAppContextWrapper(base: Context, val app: Application? = null) :
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
index ec82c85..7290be0 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
@@ -46,6 +46,9 @@
 import androidx.camera.core.UseCase;
 import androidx.camera.core.UseCaseGroup;
 import androidx.camera.core.ViewPort;
+import androidx.camera.core.concurrent.ConcurrentCamera;
+import androidx.camera.core.concurrent.ConcurrentCameraConfig;
+import androidx.camera.core.concurrent.SingleCameraConfig;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
@@ -390,6 +393,51 @@
     }
 
     /**
+     * Binds a {@link ConcurrentCameraConfig} to {@link LifecycleOwner}.
+     *
+     * <p>The concurrent camera is only supporting two cameras currently. If the input
+     * {@link ConcurrentCameraConfig} has less or more than two {@link SingleCameraConfig},
+     * {@link IllegalArgumentException} will be thrown.
+     *
+     * @param concurrentCameraConfig input configuration for concurrent camera.
+     * @return output concurrent camera instance.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @SuppressWarnings({"lambdaLast"})
+    @MainThread
+    @NonNull
+    public ConcurrentCamera bindToLifecycle(
+            @NonNull ConcurrentCameraConfig concurrentCameraConfig) {
+        // TODO(b/268347532): enable concurrent mode in camera coordinator
+        if (concurrentCameraConfig.getSingleCameraConfigs().size() < 2) {
+            throw new IllegalArgumentException("Concurrent camera needs two camera configs");
+        }
+
+        if (concurrentCameraConfig.getSingleCameraConfigs().size() > 2) {
+            throw new UnsupportedOperationException("Concurrent camera is only supporting two  "
+                    + "cameras at maximum.");
+        }
+
+        List<Camera> cameras = new ArrayList<>();
+        for (SingleCameraConfig config : concurrentCameraConfig.getSingleCameraConfigs()) {
+            Camera camera = bindToLifecycle(
+                    config.getLifecycleOwner(),
+                    config.getCameraSelector(),
+                    config.getUseCaseGroup().getViewPort(),
+                    config.getUseCaseGroup().getEffects(),
+                    config.getUseCaseGroup().getUseCases().toArray(new UseCase[0]));
+
+            cameras.add(camera);
+        }
+
+        return new ConcurrentCamera.Builder()
+                .setCameras(cameras)
+                .builder();
+    }
+
+    /**
      * Binds {@link ViewPort} and a collection of {@link UseCase} to a {@link LifecycleOwner}.
      *
      * <p>The state of the lifecycle will determine when the cameras are open, started, stopped
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/CamcorderProfileUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java
deleted file mode 100644
index 923a59b..0000000
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.testing;
-
-import android.media.CamcorderProfile;
-import android.media.MediaRecorder;
-import android.util.Size;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-
-/**
- * Utility methods for testing {@link CamcorderProfile} related classes, including predefined
- * resolutions, attributes and {@link CamcorderProfileProxy}, which can be used directly on the
- * unit tests.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class CamcorderProfileUtil {
-
-    private CamcorderProfileUtil() {
-    }
-
-    /** Resolution for QCIF. */
-    public static final Size RESOLUTION_QCIF = new Size(176, 144);
-    /** Resolution for QVGA. */
-    public static final Size RESOLUTION_QVGA = new Size(320, 240);
-    /** Resolution for CIF. */
-    public static final Size RESOLUTION_CIF = new Size(352, 288);
-    /** Resolution for VGA. */
-    public static final Size RESOLUTION_VGA = new Size(640, 480);
-    /** Resolution for 480P. */
-    public static final Size RESOLUTION_480P = new Size(720, 480); /* 640, 704 or 720 x 480 */
-    /** Resolution for 720P. */
-    public static final Size RESOLUTION_720P = new Size(1280, 720);
-    /** Resolution for 1080P. */
-    public static final Size RESOLUTION_1080P = new Size(1920, 1080); /* 1920 x 1080 or 1088 */
-    /** Resolution for 2K. */
-    public static final Size RESOLUTION_2K = new Size(2048, 1080);
-    /** Resolution for QHD. */
-    public static final Size RESOLUTION_QHD = new Size(2560, 1440);
-    /** Resolution for 2160P. */
-    public static final Size RESOLUTION_2160P = new Size(3840, 2160);
-    /** Resolution for 4KDCI. */
-    public static final Size RESOLUTION_4KDCI = new Size(4096, 2160);
-
-    /** Default duration. */
-    public static final int DEFAULT_DURATION = 30;
-    /** Default output format. */
-    public static final int DEFAULT_OUTPUT_FORMAT = MediaRecorder.OutputFormat.MPEG_4;
-    /** Default video codec. */
-    public static final int DEFAULT_VIDEO_CODEC = MediaRecorder.VideoEncoder.H264;
-    /** Default video bitrate. */
-    public static final int DEFAULT_VIDEO_BITRATE = 8 * 1024 * 1024;
-    /** Default video frame rate. */
-    public static final int DEFAULT_VIDEO_FRAME_RATE = 30;
-    /** Default audio codec. */
-    public static final int DEFAULT_AUDIO_CODEC = MediaRecorder.AudioEncoder.AAC;
-    /** Default audio bitrate. */
-    public static final int DEFAULT_AUDIO_BITRATE = 192_000;
-    /** Default audio sample rate. */
-    public static final int DEFAULT_AUDIO_SAMPLE_RATE = 48_000;
-    /** Default channel count. */
-    public static final int DEFAULT_AUDIO_CHANNELS = 1;
-
-    public static final CamcorderProfileProxy PROFILE_QCIF = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_QCIF,
-            RESOLUTION_QCIF.getWidth(),
-            RESOLUTION_QCIF.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_QVGA = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_QVGA,
-            RESOLUTION_QVGA.getWidth(),
-            RESOLUTION_QVGA.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_CIF = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_CIF,
-            RESOLUTION_CIF.getWidth(),
-            RESOLUTION_CIF.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_VGA = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_VGA,
-            RESOLUTION_VGA.getWidth(),
-            RESOLUTION_VGA.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_480P = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_480P,
-            RESOLUTION_480P.getWidth(),
-            RESOLUTION_480P.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_720P = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_720P,
-            RESOLUTION_720P.getWidth(),
-            RESOLUTION_720P.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_1080P = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_1080P,
-            RESOLUTION_1080P.getWidth(),
-            RESOLUTION_1080P.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_2K = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_2K,
-            RESOLUTION_2K.getWidth(),
-            RESOLUTION_2K.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_QHD = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_QHD,
-            RESOLUTION_QHD.getWidth(),
-            RESOLUTION_QHD.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_2160P = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_2160P,
-            RESOLUTION_2160P.getWidth(),
-            RESOLUTION_2160P.getHeight()
-    );
-
-    public static final CamcorderProfileProxy PROFILE_4KDCI = createCamcorderProfileProxy(
-            CamcorderProfile.QUALITY_4KDCI,
-            RESOLUTION_4KDCI.getWidth(),
-            RESOLUTION_4KDCI.getHeight()
-    );
-
-    /** A utility method to create a CamcorderProfileProxy with some default values. */
-    @NonNull
-    public static CamcorderProfileProxy createCamcorderProfileProxy(
-            int quality,
-            int videoFrameWidth,
-            int videoFrameHeight
-    ) {
-        return CamcorderProfileProxy.create(
-                DEFAULT_DURATION,
-                quality,
-                DEFAULT_OUTPUT_FORMAT,
-                DEFAULT_VIDEO_CODEC,
-                DEFAULT_VIDEO_BITRATE,
-                DEFAULT_VIDEO_FRAME_RATE,
-                videoFrameWidth,
-                videoFrameHeight,
-                DEFAULT_AUDIO_CODEC,
-                DEFAULT_AUDIO_BITRATE,
-                DEFAULT_AUDIO_SAMPLE_RATE,
-                DEFAULT_AUDIO_CHANNELS
-        );
-    }
-
-    /**
-     * Copies a CamcorderProfileProxy and sets the quality to
-     * {@link CamcorderProfile#QUALITY_HIGH}.
-     */
-    @NonNull
-    public static CamcorderProfileProxy asHighQuality(@NonNull CamcorderProfileProxy profile) {
-        return asQuality(profile, CamcorderProfile.QUALITY_HIGH);
-    }
-
-    /**
-     * Copies a CamcorderProfileProxy and sets the quality to
-     * {@link CamcorderProfile#QUALITY_LOW}.
-     */
-    @NonNull
-    public static CamcorderProfileProxy asLowQuality(@NonNull CamcorderProfileProxy profile) {
-        return asQuality(profile, CamcorderProfile.QUALITY_LOW);
-    }
-
-    private static CamcorderProfileProxy asQuality(@NonNull CamcorderProfileProxy profile,
-            int quality) {
-        return CamcorderProfileProxy.create(
-                profile.getDuration(),
-                quality,
-                profile.getFileFormat(),
-                profile.getVideoCodec(),
-                profile.getVideoBitRate(),
-                profile.getVideoFrameRate(),
-                profile.getVideoFrameWidth(),
-                profile.getVideoFrameHeight(),
-                profile.getAudioCodec(),
-                profile.getAudioBitRate(),
-                profile.getAudioSampleRate(),
-                profile.getAudioChannels()
-        );
-    }
-}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/EncoderProfilesUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/EncoderProfilesUtil.java
new file mode 100644
index 0000000..4c84b93
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/EncoderProfilesUtil.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.camera.testing;
+
+import android.media.EncoderProfiles;
+import android.media.MediaFormat;
+import android.media.MediaRecorder;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.ImmutableEncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+
+import java.util.Collections;
+
+/**
+ * Utility methods for testing {@link EncoderProfiles} related classes, including predefined
+ * resolutions, attributes and {@link EncoderProfilesProxy}, which can be used directly on the
+ * unit tests.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class EncoderProfilesUtil {
+
+    /** Resolution for QCIF. */
+    public static final Size RESOLUTION_QCIF = new Size(176, 144);
+    /** Resolution for QVGA. */
+    public static final Size RESOLUTION_QVGA = new Size(320, 240);
+    /** Resolution for CIF. */
+    public static final Size RESOLUTION_CIF = new Size(352, 288);
+    /** Resolution for VGA. */
+    public static final Size RESOLUTION_VGA = new Size(640, 480);
+    /** Resolution for 480P. */
+    public static final Size RESOLUTION_480P = new Size(720, 480); /* 640, 704 or 720 x 480 */
+    /** Resolution for 720P. */
+    public static final Size RESOLUTION_720P = new Size(1280, 720);
+    /** Resolution for 1080P. */
+    public static final Size RESOLUTION_1080P = new Size(1920, 1080); /* 1920 x 1080 or 1088 */
+    /** Resolution for 2K. */
+    public static final Size RESOLUTION_2K = new Size(2048, 1080);
+    /** Resolution for QHD. */
+    public static final Size RESOLUTION_QHD = new Size(2560, 1440);
+    /** Resolution for 2160P. */
+    public static final Size RESOLUTION_2160P = new Size(3840, 2160);
+    /** Resolution for 4KDCI. */
+    public static final Size RESOLUTION_4KDCI = new Size(4096, 2160);
+
+    /** Default duration. */
+    public static final int DEFAULT_DURATION = 30;
+    /** Default output format. */
+    public static final int DEFAULT_OUTPUT_FORMAT = MediaRecorder.OutputFormat.MPEG_4;
+    /** Default video codec. */
+    public static final int DEFAULT_VIDEO_CODEC = MediaRecorder.VideoEncoder.H264;
+    /** Default media type. */
+    public static final String DEFAULT_VIDEO_MEDIA_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
+    /** Default video bitrate. */
+    public static final int DEFAULT_VIDEO_BITRATE = 8 * 1024 * 1024;
+    /** Default video frame rate. */
+    public static final int DEFAULT_VIDEO_FRAME_RATE = 30;
+    /** Default video code profile. */
+    public static final int DEFAULT_VIDEO_PROFILE = EncoderProfilesProxy.CODEC_PROFILE_NONE;
+    /** Default bit depth. */
+    public static final int DEFAULT_VIDEO_BIT_DEPTH = VideoProfileProxy.BIT_DEPTH_8;
+    /** Default chroma subsampling. */
+    public static final int DEFAULT_VIDEO_CHROMA_SUBSAMPLING = EncoderProfiles.VideoProfile.YUV_420;
+    /** Default hdr format. */
+    public static final int DEFAULT_VIDEO_HDR_FORMAT = EncoderProfiles.VideoProfile.HDR_NONE;
+    /** Default audio codec. */
+    public static final int DEFAULT_AUDIO_CODEC = MediaRecorder.AudioEncoder.AAC;
+    /** Default media type. */
+    public static final String DEFAULT_AUDIO_MEDIA_TYPE = MediaFormat.MIMETYPE_AUDIO_AAC;
+    /** Default audio bitrate. */
+    public static final int DEFAULT_AUDIO_BITRATE = 192_000;
+    /** Default audio sample rate. */
+    public static final int DEFAULT_AUDIO_SAMPLE_RATE = 48_000;
+    /** Default channel count. */
+    public static final int DEFAULT_AUDIO_CHANNELS = 1;
+    /** Default audio code profile. */
+    public static final int DEFAULT_AUDIO_PROFILE = EncoderProfilesProxy.CODEC_PROFILE_NONE;
+
+    public static final EncoderProfilesProxy PROFILES_QCIF = createFakeEncoderProfilesProxy(
+            RESOLUTION_QCIF.getWidth(),
+            RESOLUTION_QCIF.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_QVGA = createFakeEncoderProfilesProxy(
+            RESOLUTION_QVGA.getWidth(),
+            RESOLUTION_QVGA.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_CIF = createFakeEncoderProfilesProxy(
+            RESOLUTION_CIF.getWidth(),
+            RESOLUTION_CIF.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_VGA = createFakeEncoderProfilesProxy(
+            RESOLUTION_VGA.getWidth(),
+            RESOLUTION_VGA.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_480P = createFakeEncoderProfilesProxy(
+            RESOLUTION_480P.getWidth(),
+            RESOLUTION_480P.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_720P = createFakeEncoderProfilesProxy(
+            RESOLUTION_720P.getWidth(),
+            RESOLUTION_720P.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_1080P = createFakeEncoderProfilesProxy(
+            RESOLUTION_1080P.getWidth(),
+            RESOLUTION_1080P.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_2K = createFakeEncoderProfilesProxy(
+            RESOLUTION_2K.getWidth(),
+            RESOLUTION_2K.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_QHD = createFakeEncoderProfilesProxy(
+            RESOLUTION_QHD.getWidth(),
+            RESOLUTION_QHD.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_2160P = createFakeEncoderProfilesProxy(
+            RESOLUTION_2160P.getWidth(),
+            RESOLUTION_2160P.getHeight()
+    );
+
+    public static final EncoderProfilesProxy PROFILES_4KDCI = createFakeEncoderProfilesProxy(
+            RESOLUTION_4KDCI.getWidth(),
+            RESOLUTION_4KDCI.getHeight()
+    );
+
+    /** A utility method to create an EncoderProfilesProxy with some default values. */
+    @NonNull
+    public static EncoderProfilesProxy createFakeEncoderProfilesProxy(
+            int videoFrameWidth,
+            int videoFrameHeight
+    ) {
+        VideoProfileProxy videoProfile = VideoProfileProxy.create(
+                DEFAULT_VIDEO_CODEC,
+                DEFAULT_VIDEO_MEDIA_TYPE,
+                DEFAULT_VIDEO_BITRATE,
+                DEFAULT_VIDEO_FRAME_RATE,
+                videoFrameWidth,
+                videoFrameHeight,
+                DEFAULT_VIDEO_PROFILE,
+                DEFAULT_VIDEO_BIT_DEPTH,
+                DEFAULT_VIDEO_CHROMA_SUBSAMPLING,
+                DEFAULT_VIDEO_HDR_FORMAT
+        );
+        AudioProfileProxy audioProfile = AudioProfileProxy.create(
+                DEFAULT_AUDIO_CODEC,
+                DEFAULT_AUDIO_MEDIA_TYPE,
+                DEFAULT_AUDIO_BITRATE,
+                DEFAULT_AUDIO_SAMPLE_RATE,
+                DEFAULT_AUDIO_CHANNELS,
+                DEFAULT_AUDIO_PROFILE
+        );
+
+        return ImmutableEncoderProfilesProxy.create(
+                DEFAULT_DURATION,
+                DEFAULT_OUTPUT_FORMAT,
+                Collections.singletonList(audioProfile),
+                Collections.singletonList(videoProfile)
+        );
+    }
+
+    // This class is not instantiable.
+    private EncoderProfilesUtil() {
+    }
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java
deleted file mode 100644
index f59107f..0000000
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.testing.fakes;
-
-import android.media.CameraProfile;
-import android.util.SparseArray;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.impl.CamcorderProfileProvider;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-
-/**
- * A fake implementation of the {@link CamcorderProfileProvider} and used for test.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class FakeCamcorderProfileProvider implements CamcorderProfileProvider {
-
-    private final SparseArray<CamcorderProfileProxy> mQualityToProfileMap;
-
-    FakeCamcorderProfileProvider(@NonNull SparseArray<CamcorderProfileProxy> qualityToProfileMap) {
-        mQualityToProfileMap = qualityToProfileMap;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    @Nullable
-    public CamcorderProfileProxy get(int quality) {
-        return mQualityToProfileMap.get(quality);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean hasProfile(int quality) {
-        return mQualityToProfileMap.get(quality) != null;
-    }
-
-    /**
-     * The builder to create a FakeCamcorderProfileProvider instance.
-     */
-    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-    public static class Builder {
-        private final SparseArray<CamcorderProfileProxy> mQualityToProfileMap = new SparseArray<>();
-
-        /**
-         * Sets the camera id and corresponding profiles.
-         *
-         * <p>In normal case, the {@link CameraProfile#QUALITY_HIGH} and
-         * {@link CameraProfile#QUALITY_LOW} should be added in order to follow the contract of
-         * CamcorderProfile.
-         */
-        @NonNull
-        public Builder addProfile(@NonNull CamcorderProfileProxy ...camcorderProfiles) {
-            for (CamcorderProfileProxy camcorderProfile : camcorderProfiles) {
-                mQualityToProfileMap.put(camcorderProfile.getQuality(), camcorderProfile);
-            }
-            return this;
-        }
-
-        /** Builds the FakeCamcorderProfileProvider instance. */
-        @NonNull
-        public FakeCamcorderProfileProvider build() {
-            return new FakeCamcorderProfileProvider(mQualityToProfileMap.clone());
-        }
-    }
-}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
index d15ce7a..77cfb2b 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
@@ -30,9 +30,9 @@
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.TorchState;
 import androidx.camera.core.ZoomState;
-import androidx.camera.core.impl.CamcorderProfileProvider;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraInfoInternal;
+import androidx.camera.core.impl.EncoderProfilesProvider;
 import androidx.camera.core.impl.ImageOutputConfig.RotationValue;
 import androidx.camera.core.impl.Quirk;
 import androidx.camera.core.impl.Quirks;
@@ -70,7 +70,7 @@
     // Leave uninitialized to support camera-core:1.0.0 dependencies.
     // Can be initialized during class init once there are no more pinned dependencies on
     // camera-core:1.0.0
-    private CamcorderProfileProvider mCamcorderProfileProvider;
+    private EncoderProfilesProvider mEncoderProfilesProvider;
 
     private boolean mIsPrivateReprocessingSupported = false;
     private float mIntrinsicZoomRatio = 1.0F;
@@ -173,9 +173,9 @@
 
     @NonNull
     @Override
-    public CamcorderProfileProvider getCamcorderProfileProvider() {
-        return mCamcorderProfileProvider == null ? CamcorderProfileProvider.EMPTY :
-                mCamcorderProfileProvider;
+    public EncoderProfilesProvider getEncoderProfilesProvider() {
+        return mEncoderProfilesProvider == null ? EncoderProfilesProvider.EMPTY :
+                mEncoderProfilesProvider;
     }
 
     @NonNull
@@ -242,10 +242,10 @@
         mImplementationType = implementationType;
     }
 
-    /** Set the CamcorderProfileProvider for testing */
-    public void setCamcorderProfileProvider(
-            @NonNull CamcorderProfileProvider camcorderProfileProvider) {
-        mCamcorderProfileProvider = Preconditions.checkNotNull(camcorderProfileProvider);
+    /** Set the EncoderProfilesProvider for testing */
+    public void setEncoderProfilesProvider(
+            @NonNull EncoderProfilesProvider encoderProfilesProvider) {
+        mEncoderProfilesProvider = Preconditions.checkNotNull(encoderProfilesProvider);
     }
 
     /** Set the timebase for testing */
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeEncoderProfilesProvider.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeEncoderProfilesProvider.java
new file mode 100644
index 0000000..a4d1e46
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeEncoderProfilesProvider.java
@@ -0,0 +1,85 @@
+/*
+ * 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.testing.fakes;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProvider;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A fake implementation of the {@link EncoderProfilesProvider} and used for test.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class FakeEncoderProfilesProvider implements EncoderProfilesProvider {
+
+    private final Map<Integer, EncoderProfilesProxy> mQualityToProfileMap;
+
+    FakeEncoderProfilesProvider(@NonNull Map<Integer, EncoderProfilesProxy> qualityToProfileMap) {
+        mQualityToProfileMap = qualityToProfileMap;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean hasProfile(int quality) {
+        return mQualityToProfileMap.get(quality) != null;
+    }
+
+    /** {@inheritDoc} */
+    @Nullable
+    @Override
+    public EncoderProfilesProxy getAll(int quality) {
+        return mQualityToProfileMap.get(quality);
+    }
+
+    /**
+     * The builder to create a FakeEncoderProfilesProvider instance.
+     */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+    public static class Builder {
+
+        private final Map<Integer, EncoderProfilesProxy> mQualityToProfileMap = new HashMap<>();
+
+        /**
+         * Adds a quality and its corresponding profiles.
+         */
+        @NonNull
+        public Builder add(int quality, @NonNull EncoderProfilesProxy profiles) {
+            mQualityToProfileMap.put(quality, profiles);
+            return this;
+        }
+
+        /**
+         * Adds qualities and their corresponding profiles.
+         */
+        @NonNull
+        public Builder addAll(@NonNull Map<Integer, EncoderProfilesProxy> qualityToProfileMap) {
+            mQualityToProfileMap.putAll(qualityToProfileMap);
+            return this;
+        }
+
+        /** Builds the FakeEncoderProfilesProvider instance. */
+        @NonNull
+        public FakeEncoderProfilesProvider build() {
+            return new FakeEncoderProfilesProvider(mQualityToProfileMap);
+        }
+    }
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakePreviewEffect.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakePreviewEffect.java
deleted file mode 100644
index e1a6ea9..0000000
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakePreviewEffect.java
+++ /dev/null
@@ -1,38 +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.camera.testing.fakes;
-
-import android.os.Build;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.CameraEffect;
-import androidx.camera.core.SurfaceProcessor;
-
-import java.util.concurrent.Executor;
-
-/**
- * A fake {@link CameraEffect} with {@link SurfaceProcessor}.
- */
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class FakePreviewEffect extends CameraEffect {
-    public FakePreviewEffect(
-            @NonNull Executor processorExecutor,
-            @NonNull SurfaceProcessor surfaceProcessor) {
-        super(PREVIEW, processorExecutor, surfaceProcessor);
-    }
-}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
new file mode 100644
index 0000000..b792c7a
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
@@ -0,0 +1,66 @@
+/*
+ * 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.camera.testing.fakes;
+
+import static androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.CameraEffect;
+import androidx.camera.core.SurfaceProcessor;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
+
+import java.util.concurrent.Executor;
+
+/**
+ * A fake {@link CameraEffect} with {@link SurfaceProcessor}.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class FakeSurfaceEffect extends CameraEffect {
+
+    private SurfaceProcessorInternal mSurfaceProcessorInternal;
+
+    public FakeSurfaceEffect(
+            @NonNull Executor processorExecutor,
+            @NonNull SurfaceProcessor surfaceProcessor) {
+        super(PREVIEW, processorExecutor, surfaceProcessor);
+    }
+
+    /**
+     * Create a fake {@link CameraEffect} the {@link #createSurfaceProcessorInternal} value
+     * overridden.
+     *
+     * <p> This is helpful when we want to make sure the {@link SurfaceProcessorInternal} is
+     * released properly.
+     */
+    public FakeSurfaceEffect(@NonNull SurfaceProcessorInternal surfaceProcessorInternal) {
+        super(PREVIEW, mainThreadExecutor(), surfaceProcessorInternal);
+        mSurfaceProcessorInternal = surfaceProcessorInternal;
+    }
+
+    @NonNull
+    @Override
+    public SurfaceProcessorInternal createSurfaceProcessorInternal() {
+        if (mSurfaceProcessorInternal != null) {
+            return mSurfaceProcessorInternal;
+        } else {
+            return super.createSurfaceProcessorInternal();
+        }
+    }
+}
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioChecker.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioChecker.kt
index dbd3371..4a6f310 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioChecker.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioChecker.kt
@@ -24,7 +24,7 @@
 import androidx.camera.testing.CameraUtil
 import androidx.camera.video.internal.AudioSource
 import androidx.camera.video.internal.FakeBufferProvider
-import androidx.camera.video.internal.config.AudioSourceSettingsCamcorderProfileResolver
+import androidx.camera.video.internal.config.AudioSourceSettingsAudioProfileResolver
 import androidx.camera.video.internal.encoder.FakeInputBuffer
 import androidx.concurrent.futures.await
 import kotlinx.coroutines.CompletableDeferred
@@ -56,16 +56,16 @@
             cameraSelector: CameraSelector,
             qualitySelector: QualitySelector
         ) = runBlocking {
-            // Get audio source settings from CamcorderProfile
+            // Get audio source settings from EncoderProfiles
             val cameraInfo =
                 CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
             val videoCapabilities = VideoCapabilities.from(cameraInfo)
             val quality = qualitySelector.getPrioritizedQualities(cameraInfo).first()
             // Get a config using the default audio spec.
             val audioSourceSettings =
-                AudioSourceSettingsCamcorderProfileResolver(
+                AudioSourceSettingsAudioProfileResolver(
                     AudioSpec.builder().build(),
-                    videoCapabilities.getProfile(quality)!!
+                    videoCapabilities.getProfiles(quality)!!.defaultAudioProfile!!
                 ).get()
             val audioSource = AudioSource(audioSourceSettings, CameraXExecutors.ioExecutor(), null)
             try {
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/DeviceCompatibilityTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/DeviceCompatibilityTest.kt
index 7892f10..1261cd5 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/DeviceCompatibilityTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/DeviceCompatibilityTest.kt
@@ -25,10 +25,11 @@
 import androidx.camera.core.CameraSelector.DEFAULT_BACK_CAMERA
 import androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA
 import androidx.camera.core.CameraXConfig
-import androidx.camera.core.impl.CamcorderProfileProxy
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy
 import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks
 import androidx.camera.video.internal.compat.quirk.MediaCodecInfoReportIncorrectInfoQuirk
 import androidx.test.core.app.ApplicationProvider
@@ -86,11 +87,11 @@
     }
 
     @Test
-    fun mediaCodecInfoShouldSupportCamcorderProfileSizes() {
+    fun mediaCodecInfoShouldSupportEncoderProfilesSizes() {
         assumeTrue(DeviceQuirks.get(MediaCodecInfoReportIncorrectInfoQuirk::class.java) == null)
 
         // Arrange: Collect all supported profiles from default back/front camera.
-        val supportedProfiles = mutableListOf<CamcorderProfileProxy>()
+        val supportedProfiles = mutableListOf<VideoValidatedEncoderProfilesProxy>()
         supportedProfiles.addAll(getSupportedProfiles(DEFAULT_BACK_CAMERA))
         supportedProfiles.addAll(getSupportedProfiles(DEFAULT_FRONT_CAMERA))
         assumeTrue(supportedProfiles.isNotEmpty())
@@ -99,7 +100,11 @@
             // Arrange: Find the codec and its video capabilities.
             // If mime is null, skip the test instead of failing it since this isn't the purpose
             // of the test.
-            val mime = profile.videoCodecMimeType ?: return@forEach
+            val videoProfile = profile.defaultVideoProfile
+            val mime = videoProfile.mediaType
+            if (mime == VideoProfileProxy.MEDIA_TYPE_NONE) {
+                return@forEach
+            }
             val capabilities = MediaCodec.createEncoderByType(mime).let { codec ->
                 try {
                     codec.codecInfo.getCapabilitiesForType(mime).videoCapabilities
@@ -109,7 +114,7 @@
             }
 
             // Act.
-            val (width, height) = profile.videoFrameWidth to profile.videoFrameHeight
+            val (width, height) = videoProfile.width to videoProfile.height
             val supportedWidths = capabilities.supportedWidths
             val supportedHeights = capabilities.supportedHeights
             val supportedWidthsForHeight = capabilities.getWidthsForHeightQuietly(height)
@@ -128,14 +133,16 @@
         }
     }
 
-    private fun getSupportedProfiles(cameraSelector: CameraSelector): List<CamcorderProfileProxy> {
+    private fun getSupportedProfiles(
+        cameraSelector: CameraSelector
+    ): List<VideoValidatedEncoderProfilesProxy> {
         if (!CameraUtil.hasCameraWithLensFacing(cameraSelector.lensFacing!!)) {
             return emptyList()
         }
         val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         return videoCapabilities.supportedQualities
-            .mapNotNull { videoCapabilities.getProfile(it) }
+            .mapNotNull { videoCapabilities.getProfiles(it) }
     }
 
     private fun android.util.Range<Int>.toClosed() = Range.closed(lower, upper)
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
index 66b2c8e..be254c5 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
@@ -37,6 +37,7 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
+import androidx.camera.core.CameraEffect
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraXConfig
@@ -47,6 +48,7 @@
 import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.fakes.FakeLifecycleOwner
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.core.util.Consumer
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
@@ -187,14 +189,14 @@
     fun qualityOptionCanRecordVideo_enableSurfaceProcessor() {
         assumeSuccessfulSurfaceProcessing()
 
-        testQualityOptionRecordVideo(surfaceProcessor = createSurfaceProcessor())
+        testQualityOptionRecordVideo(effect = createEffect())
     }
 
-    private fun testQualityOptionRecordVideo(surfaceProcessor: SurfaceProcessorInternal? = null) {
+    private fun testQualityOptionRecordVideo(effect: CameraEffect? = null) {
         // Arrange.
         val recorder = Recorder.Builder().setQualitySelector(QualitySelector.from(quality)).build()
         val videoCapture = VideoCapture.withOutput(recorder)
-        videoCapture.setProcessor(surfaceProcessor)
+        videoCapture.effect = effect
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
         val latchForRecordingStatus = CountDownLatch(5)
         val latchForRecordingFinalized = CountDownLatch(1)
@@ -239,8 +241,13 @@
         file.delete()
     }
 
-    private fun createSurfaceProcessor(): SurfaceProcessorInternal =
-        DefaultSurfaceProcessor.Factory.newInstance().apply { surfaceProcessorsToRelease.add(this) }
+    private fun createEffect(): CameraEffect {
+        val fakeSurfaceProcessor = DefaultSurfaceProcessor.Factory.newInstance()
+        surfaceProcessorsToRelease.add(fakeSurfaceProcessor)
+        return FakeSurfaceEffect(
+            fakeSurfaceProcessor
+        )
+    }
 
     /** Skips tests which will enable surface processing and encounter device specific issues. */
     private fun assumeSuccessfulSurfaceProcessing() {
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/VideoCaptureDeviceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
index 02f2e3b..4d7a118 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
@@ -44,6 +44,7 @@
 import java.util.concurrent.ArrayBlockingQueue
 import java.util.concurrent.CopyOnWriteArraySet
 import java.util.concurrent.Executors
+import java.util.concurrent.RejectedExecutionException
 import java.util.concurrent.TimeUnit
 import kotlin.time.Duration.Companion.seconds
 import kotlinx.coroutines.CompletableDeferred
@@ -404,10 +405,15 @@
                 attachToGLContext(GLUtil.getTexIdFromGLContext())
                 setOnFrameAvailableListener {
                     frameCountFlow.getAndUpdate { frameCount -> frameCount + 1 }
-                    executor.execute {
-                        if (!isReleased) {
-                            updateTexImage()
+                    try {
+                        executor.execute {
+                            if (!isReleased) {
+                                updateTexImage()
+                            }
                         }
+                    } catch (_: RejectedExecutionException) {
+                        // Ignored since frame updating is no longer needed after surface
+                        // and executor are released.
                     }
                 }
             }
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-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolverTest.kt
new file mode 100644
index 0000000..68d64f6
--- /dev/null
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolverTest.kt
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.config
+
+import android.content.Context
+import android.util.Range
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.impl.Timebase
+import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.CameraPipeConfigTestRule
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
+import androidx.camera.video.AudioSpec
+import androidx.camera.video.Quality
+import androidx.camera.video.VideoCapabilities
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+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 org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class AudioEncoderConfigAudioProfileResolverTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+    private val defaultAudioSpec = AudioSpec.builder().build()
+    private val timebase = Timebase.UPTIME
+
+    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
+    private lateinit var videoCapabilities: VideoCapabilities
+
+    @Before
+    fun setUp() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+
+        CameraXUtil.initialize(
+            context,
+            cameraConfig
+        ).get()
+
+        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
+        videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
+    }
+
+    @After
+    fun tearDown() {
+        if (this::cameraUseCaseAdapter.isInitialized) {
+            runBlocking(Dispatchers.Main) {
+                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
+            }
+        }
+
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun defaultAudioSpecAndAudioSourceProducesValidSettings() {
+        val supportedProfiles = videoCapabilities.supportedQualities.map {
+            videoCapabilities.getProfiles(it)!!
+        }
+
+        for (encoderProfiles in supportedProfiles) {
+            val audioProfile = encoderProfiles.defaultAudioProfile ?: continue
+
+            val sourceSettings =
+                AudioSourceSettingsAudioProfileResolver(
+                    defaultAudioSpec,
+                    audioProfile
+                ).get()
+            val config = AudioEncoderConfigAudioProfileResolver(
+                audioProfile.mediaType,
+                audioProfile.profile,
+                timebase,
+                defaultAudioSpec,
+                sourceSettings,
+                audioProfile
+            ).get()
+
+            assertThat(config.mimeType).isEqualTo(audioProfile.mediaType)
+            assertThat(config.bitrate).isEqualTo(audioProfile.bitrate)
+            assertThat(config.sampleRate).isEqualTo(audioProfile.sampleRate)
+            assertThat(config.channelCount).isEqualTo(audioProfile.channels)
+        }
+    }
+
+    @Test
+    fun increasedChannelCountIncreasesBitrate() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val profile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(profile != null)
+
+        // Get default channel count
+        val defaultSourceSettings =
+            AudioSourceSettingsAudioProfileResolver(
+                defaultAudioSpec,
+                profile!!
+            ).get()
+        val defaultConfig =
+            AudioEncoderConfigAudioProfileResolver(
+                profile.mediaType,
+                profile.profile,
+                timebase,
+                defaultAudioSpec,
+                defaultSourceSettings,
+                profile
+            ).get()
+        val defaultChannelCount = defaultConfig.channelCount
+
+        val higherChannelCountSourceSettings =
+            defaultSourceSettings.toBuilder().setChannelCount(defaultChannelCount * 2).build()
+
+        val higherChannelCountConfig = AudioEncoderConfigAudioProfileResolver(
+            profile.mediaType,
+            profile.profile,
+            timebase,
+            defaultAudioSpec,
+            higherChannelCountSourceSettings,
+            profile
+        ).get()
+
+        assertThat(higherChannelCountConfig.bitrate).isGreaterThan(defaultConfig.bitrate)
+    }
+
+    @Test
+    fun increasedSampleRateIncreasesBitrate() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val profile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(profile != null)
+
+        // Get default sample rate
+        val defaultSourceSettings =
+            AudioSourceSettingsAudioProfileResolver(
+                defaultAudioSpec,
+                profile!!
+            ).get()
+        val defaultConfig =
+            AudioEncoderConfigAudioProfileResolver(
+                profile.mediaType,
+                profile.profile,
+                timebase,
+                defaultAudioSpec,
+                defaultSourceSettings,
+                profile
+            ).get()
+        val defaultSampleRate = defaultConfig.sampleRate
+
+        val higherSampleRateSourceSettings =
+            defaultSourceSettings.toBuilder().setChannelCount(defaultSampleRate * 2).build()
+
+        val higherSampleRateConfig = AudioEncoderConfigAudioProfileResolver(
+            profile.mediaType,
+            profile.profile,
+            timebase,
+            defaultAudioSpec,
+            higherSampleRateSourceSettings,
+            profile
+        ).get()
+
+        assertThat(higherSampleRateConfig.bitrate).isGreaterThan(defaultConfig.bitrate)
+    }
+
+    @Test
+    fun bitrateRangeInVideoSpecClampsBitrate() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val profile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(profile != null)
+
+        val defaultSourceSettings =
+            AudioSourceSettingsAudioProfileResolver(
+                defaultAudioSpec,
+                profile!!
+            ).get()
+
+        val defaultBitrate = profile.bitrate
+
+        // Create audio spec with limit 20% higher than default.
+        val higherBitrate = (defaultBitrate * 1.2).toInt()
+        val higherAudioSpec =
+            AudioSpec.builder().setBitrate(Range(higherBitrate, Int.MAX_VALUE)).build()
+
+        // Create audio spec with limit 20% lower than default.
+        val lowerBitrate = (defaultBitrate * 0.8).toInt()
+        val lowerAudioSpec = AudioSpec.builder().setBitrate(Range(0, lowerBitrate)).build()
+
+        assertThat(
+            AudioEncoderConfigAudioProfileResolver(
+                profile.mediaType,
+                profile.profile,
+                timebase,
+                higherAudioSpec,
+                defaultSourceSettings,
+                profile
+            ).get().bitrate
+        ).isEqualTo(higherBitrate)
+
+        assertThat(
+            AudioEncoderConfigAudioProfileResolver(
+                profile.mediaType,
+                profile.profile,
+                timebase,
+                lowerAudioSpec,
+                defaultSourceSettings,
+                profile
+            ).get().bitrate
+        ).isEqualTo(lowerBitrate)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolverTest.kt
deleted file mode 100644
index df98596..0000000
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolverTest.kt
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.video.internal.config
-
-import android.content.Context
-import android.util.Range
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.pipe.integration.CameraPipeConfig
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraXConfig
-import androidx.camera.core.impl.Timebase
-import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.testing.CameraPipeConfigTestRule
-import androidx.camera.testing.CameraUtil
-import androidx.camera.testing.CameraXUtil
-import androidx.camera.video.AudioSpec
-import androidx.camera.video.Quality
-import androidx.camera.video.VideoCapabilities
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-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 org.junit.runners.Parameterized
-
-@RunWith(Parameterized::class)
-@SmallTest
-@SdkSuppress(minSdkVersion = 21)
-class AudioEncoderConfigCamcorderProfileResolverTest(
-    private val implName: String,
-    private val cameraConfig: CameraXConfig
-) {
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun data() = listOf(
-            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
-            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
-        )
-    }
-
-    @get:Rule
-    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
-        active = implName == CameraPipeConfig::class.simpleName,
-    )
-
-    private val context: Context = ApplicationProvider.getApplicationContext()
-    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
-    private val defaultAudioSpec = AudioSpec.builder().build()
-    private val timebase = Timebase.UPTIME
-
-    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
-    private lateinit var videoCapabilities: VideoCapabilities
-
-    @Before
-    fun setUp() {
-        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
-
-        CameraXUtil.initialize(
-            context,
-            cameraConfig
-        ).get()
-
-        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
-        videoCapabilities = VideoCapabilities.from(cameraInfo)
-        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
-    }
-
-    @After
-    fun tearDown() {
-        if (this::cameraUseCaseAdapter.isInitialized) {
-            runBlocking(Dispatchers.Main) {
-                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
-            }
-        }
-
-        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
-    }
-
-    @Test
-    fun defaultAudioSpecAndAudioSourceProducesValidSettings() {
-        val supportedProfiles = videoCapabilities.supportedQualities.map {
-            videoCapabilities.getProfile(it)!!
-        }
-
-        supportedProfiles.forEach {
-            val sourceSettings =
-                AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, it).get()
-            val config = AudioEncoderConfigCamcorderProfileResolver(
-                it.audioCodecMimeType!!,
-                it.requiredAudioProfile,
-                timebase,
-                defaultAudioSpec,
-                sourceSettings,
-                it
-            ).get()
-
-            assertThat(config.mimeType).isEqualTo(it.audioCodecMimeType)
-            assertThat(config.bitrate).isEqualTo(it.audioBitRate)
-            assertThat(config.sampleRate).isEqualTo(it.audioSampleRate)
-            assertThat(config.channelCount).isEqualTo(it.audioChannels)
-        }
-    }
-
-    @Test
-    fun increasedChannelCountIncreasesBitrate() {
-        // Get default channel count
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val defaultSourceSettings =
-            AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, profile).get()
-        val defaultConfig =
-            AudioEncoderConfigCamcorderProfileResolver(
-                profile.audioCodecMimeType!!,
-                profile.requiredAudioProfile,
-                timebase,
-                defaultAudioSpec,
-                defaultSourceSettings,
-                profile
-            ).get()
-        val defaultChannelCount = defaultConfig.channelCount
-
-        val higherChannelCountSourceSettings =
-            defaultSourceSettings.toBuilder().setChannelCount(defaultChannelCount * 2).build()
-
-        val higherChannelCountConfig = AudioEncoderConfigCamcorderProfileResolver(
-            profile.audioCodecMimeType!!,
-            profile.requiredAudioProfile,
-            timebase,
-            defaultAudioSpec,
-            higherChannelCountSourceSettings,
-            profile
-        ).get()
-
-        assertThat(higherChannelCountConfig.bitrate).isGreaterThan(defaultConfig.bitrate)
-    }
-
-    @Test
-    fun increasedSampleRateIncreasesBitrate() {
-        // Get default sample rate
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val defaultSourceSettings =
-            AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, profile).get()
-        val defaultConfig =
-            AudioEncoderConfigCamcorderProfileResolver(
-                profile.audioCodecMimeType!!,
-                profile.requiredAudioProfile,
-                timebase,
-                defaultAudioSpec,
-                defaultSourceSettings,
-                profile
-            ).get()
-        val defaultSampleRate = defaultConfig.sampleRate
-
-        val higherSampleRateSourceSettings =
-            defaultSourceSettings.toBuilder().setChannelCount(defaultSampleRate * 2).build()
-
-        val higherSampleRateConfig = AudioEncoderConfigCamcorderProfileResolver(
-            profile.audioCodecMimeType!!,
-            profile.requiredAudioProfile,
-            timebase,
-            defaultAudioSpec,
-            higherSampleRateSourceSettings,
-            profile
-        ).get()
-
-        assertThat(higherSampleRateConfig.bitrate).isGreaterThan(defaultConfig.bitrate)
-    }
-
-    @Test
-    fun bitrateRangeInVideoSpecClampsBitrate() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val defaultSourceSettings =
-            AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, profile).get()
-
-        val defaultBitrate = profile.audioBitRate
-
-        // Create audio spec with limit 20% higher than default.
-        val higherBitrate = (defaultBitrate * 1.2).toInt()
-        val higherAudioSpec =
-            AudioSpec.builder().setBitrate(Range(higherBitrate, Int.MAX_VALUE)).build()
-
-        // Create audio spec with limit 20% lower than default.
-        val lowerBitrate = (defaultBitrate * 0.8).toInt()
-        val lowerAudioSpec = AudioSpec.builder().setBitrate(Range(0, lowerBitrate)).build()
-
-        assertThat(
-            AudioEncoderConfigCamcorderProfileResolver(
-                profile.audioCodecMimeType!!,
-                profile.requiredAudioProfile,
-                timebase,
-                higherAudioSpec,
-                defaultSourceSettings,
-                profile
-            ).get().bitrate
-        ).isEqualTo(higherBitrate)
-
-        assertThat(
-            AudioEncoderConfigCamcorderProfileResolver(
-                profile.audioCodecMimeType!!,
-                profile.requiredAudioProfile,
-                timebase,
-                lowerAudioSpec,
-                defaultSourceSettings,
-                profile
-            ).get().bitrate
-        ).isEqualTo(lowerBitrate)
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolverTest.kt
new file mode 100644
index 0000000..13e4086
--- /dev/null
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolverTest.kt
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.config
+
+import android.content.Context
+import android.media.AudioFormat
+import android.media.MediaRecorder
+import android.util.Range
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.AudioUtil
+import androidx.camera.testing.CameraPipeConfigTestRule
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
+import androidx.camera.video.AudioSpec
+import androidx.camera.video.Quality
+import androidx.camera.video.VideoCapabilities
+import androidx.camera.video.internal.AudioSource
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+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 org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class AudioSourceSettingsAudioProfileResolverTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+    private val defaultAudioSpec = AudioSpec.builder().build()
+
+    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
+    private lateinit var videoCapabilities: VideoCapabilities
+
+    @Before
+    fun setUp() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+        // Skip for b/168175357
+        Assume.assumeTrue(AudioUtil.canStartAudioRecord(MediaRecorder.AudioSource.CAMCORDER))
+
+        CameraXUtil.initialize(
+            context,
+            cameraConfig
+        ).get()
+
+        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
+        videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
+    }
+
+    @After
+    fun tearDown() {
+        if (this::cameraUseCaseAdapter.isInitialized) {
+            runBlocking(Dispatchers.Main) {
+                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
+            }
+        }
+
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun defaultAudioSpecResolvesToSupportedSettings() {
+        val resolvedSettings = videoCapabilities.supportedQualities.mapNotNull {
+            val encoderProfiles = videoCapabilities.getProfiles(it)!!
+            val audioProfile = encoderProfiles.defaultAudioProfile
+            if (audioProfile == null) {
+                null
+            } else {
+                AudioSourceSettingsAudioProfileResolver(
+                    defaultAudioSpec,
+                    audioProfile
+                ).get()
+            }
+        }
+
+        resolvedSettings.forEach {
+            assertThat(
+                AudioSource.isSettingsSupported(
+                    it.sampleRate,
+                    it.channelCount,
+                    it.audioFormat
+                )
+            )
+        }
+    }
+
+    @Test
+    fun nonDefaultAudioSpecResolvesToSupportedSampleRate() {
+        val audioSpecs = listOf(
+            AudioSpec.builder().setSampleRate(Range(0, 1000)).build(),
+            AudioSpec.builder().setSampleRate(Range(1000, 10000)).build(),
+            AudioSpec.builder().setSampleRate(Range(10000, 100000)).build()
+        )
+
+        val resolvedSettings = videoCapabilities.supportedQualities.flatMap { quality ->
+            val encoderProfiles = videoCapabilities.getProfiles(quality)!!
+            val audioProfile = encoderProfiles.defaultAudioProfile
+            if (audioProfile == null) {
+                emptyList()
+            } else {
+                audioSpecs.map {
+                    AudioSourceSettingsAudioProfileResolver(
+                        it,
+                        audioProfile
+                    ).get()
+                }
+            }
+        }
+
+        resolvedSettings.forEach {
+            assertThat(
+                AudioSource.isSettingsSupported(
+                    it.sampleRate,
+                    it.channelCount,
+                    it.audioFormat
+                )
+            )
+        }
+    }
+
+    @Test
+    fun sampleRateCanOverrideEncoderProfiles_ifSupported() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val audioProfile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(audioProfile != null)
+
+        // Get a config using the default audio spec to retrieve the source format
+        // Note: This relies on resolution of sample rate and source format being independent.
+        // If a dependency between the two is introduced, this will stop working and will
+        // need to be rewritten.
+        val autoEncoderProfileConfig =
+            AudioSourceSettingsAudioProfileResolver(
+                defaultAudioSpec,
+                audioProfile!!
+            ).get()
+        // Try to find a sample rate that is supported, but not the
+        // sample rate advertised by EncoderProfiles
+        val nonReportedSampleRate = AudioSource.COMMON_SAMPLE_RATES.firstOrNull {
+            it != audioProfile.sampleRate && AudioSource.isSettingsSupported(
+                it,
+                audioProfile.channels,
+                autoEncoderProfileConfig.audioFormat
+            )
+        }
+        Assume.assumeTrue(
+            "Device does not support any other common sample rates. Cannot override.",
+            nonReportedSampleRate != null
+        )
+
+        // Create an audio spec that overrides the auto sample rate behavior
+        val audioSpec =
+            AudioSpec.builder().setSampleRate(Range(nonReportedSampleRate!!, nonReportedSampleRate))
+                .build()
+        val resolvedSampleRate =
+            AudioSourceSettingsAudioProfileResolver(
+                audioSpec,
+                audioProfile
+            ).get().sampleRate
+
+        assertThat(resolvedSampleRate).isNotEqualTo(audioProfile.sampleRate)
+        assertThat(resolvedSampleRate).isEqualTo(nonReportedSampleRate)
+    }
+
+    @Test
+    fun audioSpecDefaultProducesValidSourceEnum() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val audioProfile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(audioProfile != null)
+
+        val audioSpec = AudioSpec.builder().build()
+        val resolvedAudioSourceEnum =
+            AudioSourceSettingsAudioProfileResolver(
+                audioSpec,
+                audioProfile!!
+            ).get().audioSource
+
+        assertThat(resolvedAudioSourceEnum).isAnyOf(
+            MediaRecorder.AudioSource.CAMCORDER,
+            MediaRecorder.AudioSource.MIC
+        )
+    }
+
+    @Test
+    fun audioSpecDefaultProducesValidSourceFormat() {
+        val encoderProfiles = videoCapabilities.getProfiles(Quality.HIGHEST)!!
+        val audioProfile = encoderProfiles.defaultAudioProfile
+        Assume.assumeTrue(audioProfile != null)
+
+        val audioSpec = AudioSpec.builder().build()
+        val resolvedAudioSourceFormat =
+            AudioSourceSettingsAudioProfileResolver(
+                audioSpec,
+                audioProfile!!
+            ).get().audioFormat
+
+        assertThat(resolvedAudioSourceFormat).isNotEqualTo(AudioFormat.ENCODING_INVALID)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolverTest.kt
deleted file mode 100644
index 5d67a7a..0000000
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolverTest.kt
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.video.internal.config
-
-import android.content.Context
-import android.media.AudioFormat
-import android.media.MediaRecorder
-import android.util.Range
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.pipe.integration.CameraPipeConfig
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraXConfig
-import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.testing.AudioUtil
-import androidx.camera.testing.CameraPipeConfigTestRule
-import androidx.camera.testing.CameraUtil
-import androidx.camera.testing.CameraXUtil
-import androidx.camera.video.AudioSpec
-import androidx.camera.video.Quality
-import androidx.camera.video.VideoCapabilities
-import androidx.camera.video.internal.AudioSource
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-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 org.junit.runners.Parameterized
-
-@RunWith(Parameterized::class)
-@SmallTest
-@SdkSuppress(minSdkVersion = 21)
-class AudioSourceSettingsCamcorderProfileResolverTest(
-    private val implName: String,
-    private val cameraConfig: CameraXConfig
-) {
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun data() = listOf(
-            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
-            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
-        )
-    }
-
-    @get:Rule
-    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
-        active = implName == CameraPipeConfig::class.simpleName,
-    )
-
-    private val context: Context = ApplicationProvider.getApplicationContext()
-    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
-    private val defaultAudioSpec = AudioSpec.builder().build()
-
-    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
-    private lateinit var videoCapabilities: VideoCapabilities
-
-    @Before
-    fun setUp() {
-        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
-        // Skip for b/168175357
-        Assume.assumeTrue(AudioUtil.canStartAudioRecord(MediaRecorder.AudioSource.CAMCORDER))
-
-        CameraXUtil.initialize(
-            context,
-            cameraConfig
-        ).get()
-
-        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
-        videoCapabilities = VideoCapabilities.from(cameraInfo)
-        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
-    }
-
-    @After
-    fun tearDown() {
-        if (this::cameraUseCaseAdapter.isInitialized) {
-            runBlocking(Dispatchers.Main) {
-                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
-            }
-        }
-
-        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
-    }
-
-    @Test
-    fun defaultAudioSpecResolvesToSupportedSettings() {
-        val resolvedSettings = videoCapabilities.supportedQualities.map {
-            val camcorderProfile = videoCapabilities.getProfile(it)
-            AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, camcorderProfile!!).get()
-        }
-
-        resolvedSettings.forEach {
-            assertThat(
-                AudioSource.isSettingsSupported(
-                    it.sampleRate,
-                    it.channelCount,
-                    it.audioFormat
-                )
-            )
-        }
-    }
-
-    @Test
-    fun nonDefaultAudioSpecResolvesToSupportedSampleRate() {
-        val audioSpecs = listOf(
-            AudioSpec.builder().setSampleRate(Range(0, 1000)).build(),
-            AudioSpec.builder().setSampleRate(Range(1000, 10000)).build(),
-            AudioSpec.builder().setSampleRate(Range(10000, 100000)).build()
-        )
-
-        val resolvedSettings = videoCapabilities.supportedQualities.flatMap { quality ->
-            val camcorderProfile = videoCapabilities.getProfile(quality)
-            audioSpecs.map {
-                AudioSourceSettingsCamcorderProfileResolver(it, camcorderProfile!!).get()
-            }
-        }
-
-        resolvedSettings.forEach {
-            assertThat(
-                AudioSource.isSettingsSupported(
-                    it.sampleRate,
-                    it.channelCount,
-                    it.audioFormat
-                )
-            )
-        }
-    }
-
-    @Test
-    fun sampleRateCanOverrideCamcorderProfile_ifSupported() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)
-        // Get a config using the default audio spec to retrieve the source format
-        // Note: This relies on resolution of sample rate and source format being independent.
-        // If a dependency between the two is introduced, this will stop working and will
-        // need to be rewritten.
-        val autoCamcorderProfileConfig =
-            AudioSourceSettingsCamcorderProfileResolver(defaultAudioSpec, profile!!).get()
-        // Try to find a sample rate that is supported, but not the
-        // sample rate advertised by CamcorderProfile
-        val nonReportedSampleRate = AudioSource.COMMON_SAMPLE_RATES.firstOrNull {
-            it != profile.audioSampleRate && AudioSource.isSettingsSupported(
-                it,
-                profile.audioChannels,
-                autoCamcorderProfileConfig.audioFormat
-            )
-        }
-        Assume.assumeTrue(
-            "Device does not support any other common sample rates. Cannot override.",
-            nonReportedSampleRate != null
-        )
-
-        // Create an audio spec that overrides the auto sample rate behavior
-        val audioSpec =
-            AudioSpec.builder().setSampleRate(Range(nonReportedSampleRate!!, nonReportedSampleRate))
-                .build()
-        val resolvedSampleRate =
-            AudioSourceSettingsCamcorderProfileResolver(audioSpec, profile).get().sampleRate
-
-        assertThat(resolvedSampleRate).isNotEqualTo(profile.audioSampleRate)
-        assertThat(resolvedSampleRate).isEqualTo(nonReportedSampleRate)
-    }
-
-    @Test
-    fun audioSpecDefaultProducesValidSourceEnum() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)
-        val audioSpec = AudioSpec.builder().build()
-        val resolvedAudioSourceEnum =
-            AudioSourceSettingsCamcorderProfileResolver(
-                audioSpec,
-                profile!!
-            ).get().audioSource
-
-        assertThat(resolvedAudioSourceEnum).isAnyOf(
-            MediaRecorder.AudioSource.CAMCORDER,
-            MediaRecorder.AudioSource.MIC
-        )
-    }
-
-    @Test
-    fun audioSpecDefaultProducesValidSourceFormat() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)
-        val audioSpec = AudioSpec.builder().build()
-        val resolvedAudioSourceFormat =
-            AudioSourceSettingsCamcorderProfileResolver(
-                audioSpec,
-                profile!!
-            ).get().audioFormat
-
-        assertThat(resolvedAudioSourceFormat).isNotEqualTo(AudioFormat.ENCODING_INVALID)
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolverTest.kt
deleted file mode 100644
index 1a555f6..0000000
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolverTest.kt
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.video.internal.config
-
-import android.content.Context
-import android.util.Range
-import android.util.Size
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.pipe.integration.CameraPipeConfig
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraXConfig
-import androidx.camera.core.impl.Timebase
-import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.testing.CameraPipeConfigTestRule
-import androidx.camera.testing.CameraUtil
-import androidx.camera.testing.CameraXUtil
-import androidx.camera.video.Quality
-import androidx.camera.video.VideoCapabilities
-import androidx.camera.video.VideoSpec
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-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 org.junit.runners.Parameterized
-
-@RunWith(Parameterized::class)
-@SmallTest
-@SdkSuppress(minSdkVersion = 21)
-class VideoEncoderConfigCamcorderProfileResolverTest(
-    private val implName: String,
-    private val cameraConfig: CameraXConfig
-) {
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "{0}")
-        fun data() = listOf(
-            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
-            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
-        )
-    }
-
-    @get:Rule
-    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
-        active = implName == CameraPipeConfig::class.simpleName,
-    )
-
-    private val context: Context = ApplicationProvider.getApplicationContext()
-    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
-    private val defaultVideoSpec = VideoSpec.builder().build()
-    private val timebase = Timebase.UPTIME
-
-    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
-    private lateinit var videoCapabilities: VideoCapabilities
-
-    @Before
-    fun setUp() {
-        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
-
-        CameraXUtil.initialize(
-            context,
-            cameraConfig
-        ).get()
-
-        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
-        videoCapabilities = VideoCapabilities.from(cameraInfo)
-        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
-    }
-
-    @After
-    fun tearDown() {
-        if (this::cameraUseCaseAdapter.isInitialized) {
-            runBlocking(Dispatchers.Main) {
-                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
-            }
-        }
-
-        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
-    }
-
-    @Test
-    fun defaultVideoSpecProducesValidSettings_forSurfaceSizeEquivalentToQuality() {
-        val supportedProfiles = videoCapabilities.supportedQualities.map {
-            videoCapabilities.getProfile(it)!!
-        }
-
-        supportedProfiles.forEach {
-            val config = VideoEncoderConfigCamcorderProfileResolver(
-                it.videoCodecMimeType!!,
-                timebase,
-                defaultVideoSpec,
-                Size(it.videoFrameWidth, it.videoFrameHeight),
-                it,
-                /*expectedFrameRateRange=*/null
-            ).get()
-
-            assertThat(config.mimeType).isEqualTo(it.videoCodecMimeType)
-            assertThat(config.bitrate).isEqualTo(it.videoBitRate)
-            assertThat(config.resolution).isEqualTo(Size(it.videoFrameWidth, it.videoFrameHeight))
-            assertThat(config.frameRate).isEqualTo(it.videoFrameRate)
-        }
-    }
-
-    @Test
-    fun bitrateIncreasesOrDecreasesWithIncreaseOrDecreaseInSurfaceSize() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
-
-        val defaultBitrate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            /*expectedFrameRateRange=*/null
-        ).get().bitrate
-
-        val increasedSurfaceSize = Size(surfaceSize.width + 100, surfaceSize.height + 100)
-        val decreasedSurfaceSize = Size(surfaceSize.width - 100, surfaceSize.height - 100)
-
-        assertThat(
-            VideoEncoderConfigCamcorderProfileResolver(
-                profile.videoCodecMimeType!!,
-                timebase,
-                defaultVideoSpec,
-                increasedSurfaceSize,
-                profile,
-                /*expectedFrameRateRange=*/null
-            ).get().bitrate
-        ).isGreaterThan(defaultBitrate)
-
-        assertThat(
-            VideoEncoderConfigCamcorderProfileResolver(
-                profile.videoCodecMimeType!!,
-                timebase,
-                defaultVideoSpec,
-                decreasedSurfaceSize,
-                profile,
-                /*expectedFrameRateRange=*/null
-            ).get().bitrate
-        ).isLessThan(defaultBitrate)
-    }
-
-    @Test
-    fun bitrateRangeInVideoSpecClampsBitrate() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
-
-        val defaultBitrate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            /*expectedFrameRateRange=*/null
-        ).get().bitrate
-
-        // Create video spec with limit 20% higher than default.
-        val higherBitrate = (defaultBitrate * 1.2).toInt()
-        val higherVideoSpec =
-            VideoSpec.builder().setBitrate(Range(higherBitrate, Int.MAX_VALUE)).build()
-
-        // Create video spec with limit 20% lower than default.
-        val lowerBitrate = (defaultBitrate * 0.8).toInt()
-        val lowerVideoSpec = VideoSpec.builder().setBitrate(Range(0, lowerBitrate)).build()
-
-        assertThat(
-            VideoEncoderConfigCamcorderProfileResolver(
-                profile.videoCodecMimeType!!,
-                timebase,
-                higherVideoSpec,
-                surfaceSize,
-                profile,
-                /*expectedFrameRateRange=*/null
-            ).get().bitrate
-        ).isEqualTo(higherBitrate)
-
-        assertThat(
-            VideoEncoderConfigCamcorderProfileResolver(
-                profile.videoCodecMimeType!!,
-                timebase,
-                lowerVideoSpec,
-                surfaceSize,
-                profile,
-                /*expectedFrameRateRange=*/null
-            ).get().bitrate
-        ).isEqualTo(lowerBitrate)
-    }
-
-    @Test
-    fun resolvedFrameRateIsClampedToOperatingRate() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
-
-        // Construct operating ranges that are both lower and higher than the profile FPS
-        val lowerOperatingRange = Range(profile.videoFrameRate / 4, profile.videoFrameRate / 2)
-        val higherOperatingRange = Range(profile.videoFrameRate * 2, profile.videoFrameRate * 4)
-
-        val clampedDownFrameRate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            lowerOperatingRange
-        ).get().frameRate
-
-        val clampedUpFrameRate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            higherOperatingRange
-        ).get().frameRate
-
-        assertThat(clampedDownFrameRate).isEqualTo(lowerOperatingRange.upper)
-        assertThat(clampedUpFrameRate).isEqualTo(higherOperatingRange.lower)
-    }
-
-    @Test
-    fun resolvedFrameRateInsideOperatingRangeIsUnchanged() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
-
-        // Construct a range that includes the profile FPS
-        val operatingRange = Range(profile.videoFrameRate / 2, profile.videoFrameRate * 2)
-
-        val resolvedFrameRate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            operatingRange
-        ).get().frameRate
-
-        assertThat(resolvedFrameRate).isEqualTo(profile.videoFrameRate)
-    }
-
-    @Test
-    fun bitrateScalesWithFrameRateOperatingRange() {
-        val profile = videoCapabilities.getProfile(Quality.HIGHEST)!!
-        val surfaceSize = Size(profile.videoFrameWidth, profile.videoFrameHeight)
-
-        // Construct a range which is constant and half the profile FPS
-        val operatingFrameRate = profile.videoFrameRate / 2
-        val operatingRange = Range(operatingFrameRate, operatingFrameRate)
-
-        val resolvedBitrate = VideoEncoderConfigCamcorderProfileResolver(
-            profile.videoCodecMimeType!!,
-            timebase,
-            defaultVideoSpec,
-            surfaceSize,
-            profile,
-            operatingRange
-        ).get().bitrate
-
-        assertThat(resolvedBitrate).isEqualTo(
-            (profile.videoBitRate *
-                (operatingFrameRate.toDouble() / profile.videoFrameRate)).toInt()
-        )
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolverTest.kt
index 066adfd..afdaa23 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolverTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigDefaultResolverTest.kt
@@ -18,7 +18,7 @@
 
 import android.util.Range
 import androidx.camera.core.impl.Timebase
-import androidx.camera.testing.CamcorderProfileUtil
+import androidx.camera.testing.EncoderProfilesUtil
 import androidx.camera.video.VideoSpec
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
@@ -44,9 +44,9 @@
 
     @Test
     fun defaultVideoSpecProducesValidSettings_forDifferentSurfaceSizes() {
-        val surfaceSizeCif = CamcorderProfileUtil.RESOLUTION_CIF
-        val surfaceSize720p = CamcorderProfileUtil.RESOLUTION_720P
-        val surfaceSize1080p = CamcorderProfileUtil.RESOLUTION_1080P
+        val surfaceSizeCif = EncoderProfilesUtil.RESOLUTION_CIF
+        val surfaceSize720p = EncoderProfilesUtil.RESOLUTION_720P
+        val surfaceSize1080p = EncoderProfilesUtil.RESOLUTION_1080P
 
         val expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_30)
 
@@ -96,7 +96,7 @@
 
     @Test
     fun bitrateRangeInVideoSpecClampsBitrate() {
-        val surfaceSize720p = CamcorderProfileUtil.RESOLUTION_720P
+        val surfaceSize720p = EncoderProfilesUtil.RESOLUTION_720P
 
         // Get default bit rate for this size
         val defaultConfig =
@@ -144,7 +144,7 @@
         // Give a VideoSpec with a frame rate higher than 30
         val videoSpec =
             VideoSpec.builder().setFrameRate(Range(FRAME_RATE_60, FRAME_RATE_60)).build()
-        val size = CamcorderProfileUtil.RESOLUTION_1080P
+        val size = EncoderProfilesUtil.RESOLUTION_1080P
 
         assertThat(
             VideoEncoderConfigDefaultResolver(
@@ -164,7 +164,7 @@
         // Give a VideoSpec with a frame rate higher than 30
         val videoSpec =
             VideoSpec.builder().setFrameRate(Range(FRAME_RATE_60, FRAME_RATE_60)).build()
-        val size = CamcorderProfileUtil.RESOLUTION_1080P
+        val size = EncoderProfilesUtil.RESOLUTION_1080P
 
         val expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_30)
 
@@ -187,7 +187,7 @@
         // Give a VideoSpec with a frame rate higher than 30
         val videoSpec =
             VideoSpec.builder().setFrameRate(Range(FRAME_RATE_30, FRAME_RATE_45)).build()
-        val size = CamcorderProfileUtil.RESOLUTION_1080P
+        val size = EncoderProfilesUtil.RESOLUTION_1080P
 
         val expectedFrameRateRange = Range(FRAME_RATE_30, FRAME_RATE_60)
 
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolverTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolverTest.kt
new file mode 100644
index 0000000..1719d00
--- /dev/null
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolverTest.kt
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.config
+
+import android.content.Context
+import android.util.Range
+import android.util.Size
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.impl.Timebase
+import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.CameraPipeConfigTestRule
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
+import androidx.camera.video.Quality
+import androidx.camera.video.VideoCapabilities
+import androidx.camera.video.VideoSpec
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+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 org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@SmallTest
+@SdkSuppress(minSdkVersion = 21)
+class VideoEncoderConfigVideoProfileResolverTest(
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+    private val defaultVideoSpec = VideoSpec.builder().build()
+    private val timebase = Timebase.UPTIME
+
+    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
+    private lateinit var videoCapabilities: VideoCapabilities
+
+    @Before
+    fun setUp() {
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
+
+        CameraXUtil.initialize(
+            context,
+            cameraConfig
+        ).get()
+
+        val cameraInfo = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector).cameraInfo
+        videoCapabilities = VideoCapabilities.from(cameraInfo)
+        Assume.assumeTrue(videoCapabilities.supportedQualities.isNotEmpty())
+    }
+
+    @After
+    fun tearDown() {
+        if (this::cameraUseCaseAdapter.isInitialized) {
+            runBlocking(Dispatchers.Main) {
+                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
+            }
+        }
+
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun defaultVideoSpecProducesValidSettings_forSurfaceSizeEquivalentToQuality() {
+        val supportedProfiles = videoCapabilities.supportedQualities.map {
+            videoCapabilities.getProfiles(it)!!
+        }
+
+        supportedProfiles.forEach {
+            val videoProfile = it.defaultVideoProfile
+            val config = VideoEncoderConfigVideoProfileResolver(
+                videoProfile.mediaType,
+                timebase,
+                defaultVideoSpec,
+                Size(videoProfile.width, videoProfile.height),
+                videoProfile,
+                /*expectedFrameRateRange=*/null
+            ).get()
+
+            assertThat(config.mimeType).isEqualTo(videoProfile.mediaType)
+            assertThat(config.bitrate).isEqualTo(videoProfile.bitrate)
+            assertThat(config.resolution).isEqualTo(Size(videoProfile.width, videoProfile.height))
+            assertThat(config.frameRate).isEqualTo(videoProfile.frameRate)
+        }
+    }
+
+    @Test
+    fun bitrateIncreasesOrDecreasesWithIncreaseOrDecreaseInSurfaceSize() {
+        val profile = videoCapabilities.getProfiles(Quality.HIGHEST)!!.defaultVideoProfile
+        val surfaceSize = Size(profile.width, profile.height)
+
+        val defaultBitrate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            /*expectedFrameRateRange=*/null
+        ).get().bitrate
+
+        val increasedSurfaceSize = Size(surfaceSize.width + 100, surfaceSize.height + 100)
+        val decreasedSurfaceSize = Size(surfaceSize.width - 100, surfaceSize.height - 100)
+
+        assertThat(
+            VideoEncoderConfigVideoProfileResolver(
+                profile.mediaType,
+                timebase,
+                defaultVideoSpec,
+                increasedSurfaceSize,
+                profile,
+                /*expectedFrameRateRange=*/null
+            ).get().bitrate
+        ).isGreaterThan(defaultBitrate)
+
+        assertThat(
+            VideoEncoderConfigVideoProfileResolver(
+                profile.mediaType,
+                timebase,
+                defaultVideoSpec,
+                decreasedSurfaceSize,
+                profile,
+                /*expectedFrameRateRange=*/null
+            ).get().bitrate
+        ).isLessThan(defaultBitrate)
+    }
+
+    @Test
+    fun bitrateRangeInVideoSpecClampsBitrate() {
+        val profile = videoCapabilities.getProfiles(Quality.HIGHEST)!!.defaultVideoProfile
+        val surfaceSize = Size(profile.width, profile.height)
+
+        val defaultBitrate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            /*expectedFrameRateRange=*/null
+        ).get().bitrate
+
+        // Create video spec with limit 20% higher than default.
+        val higherBitrate = (defaultBitrate * 1.2).toInt()
+        val higherVideoSpec =
+            VideoSpec.builder().setBitrate(Range(higherBitrate, Int.MAX_VALUE)).build()
+
+        // Create video spec with limit 20% lower than default.
+        val lowerBitrate = (defaultBitrate * 0.8).toInt()
+        val lowerVideoSpec = VideoSpec.builder().setBitrate(Range(0, lowerBitrate)).build()
+
+        assertThat(
+            VideoEncoderConfigVideoProfileResolver(
+                profile.mediaType,
+                timebase,
+                higherVideoSpec,
+                surfaceSize,
+                profile,
+                /*expectedFrameRateRange=*/null
+            ).get().bitrate
+        ).isEqualTo(higherBitrate)
+
+        assertThat(
+            VideoEncoderConfigVideoProfileResolver(
+                profile.mediaType,
+                timebase,
+                lowerVideoSpec,
+                surfaceSize,
+                profile,
+                /*expectedFrameRateRange=*/null
+            ).get().bitrate
+        ).isEqualTo(lowerBitrate)
+    }
+
+    @Test
+    fun resolvedFrameRateIsClampedToOperatingRate() {
+        val profile = videoCapabilities.getProfiles(Quality.HIGHEST)!!.defaultVideoProfile
+        val surfaceSize = Size(profile.width, profile.height)
+
+        // Construct operating ranges that are both lower and higher than the profile FPS
+        val lowerOperatingRange = Range(profile.frameRate / 4, profile.frameRate / 2)
+        val higherOperatingRange = Range(profile.frameRate * 2, profile.frameRate * 4)
+
+        val clampedDownFrameRate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            lowerOperatingRange
+        ).get().frameRate
+
+        val clampedUpFrameRate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            higherOperatingRange
+        ).get().frameRate
+
+        assertThat(clampedDownFrameRate).isEqualTo(lowerOperatingRange.upper)
+        assertThat(clampedUpFrameRate).isEqualTo(higherOperatingRange.lower)
+    }
+
+    @Test
+    fun resolvedFrameRateInsideOperatingRangeIsUnchanged() {
+        val profile = videoCapabilities.getProfiles(Quality.HIGHEST)!!.defaultVideoProfile
+        val surfaceSize = Size(profile.width, profile.height)
+
+        // Construct a range that includes the profile FPS
+        val operatingRange = Range(profile.frameRate / 2, profile.frameRate * 2)
+
+        val resolvedFrameRate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            operatingRange
+        ).get().frameRate
+
+        assertThat(resolvedFrameRate).isEqualTo(profile.frameRate)
+    }
+
+    @Test
+    fun bitrateScalesWithFrameRateOperatingRange() {
+        val profile = videoCapabilities.getProfiles(Quality.HIGHEST)!!.defaultVideoProfile
+        val surfaceSize = Size(profile.width, profile.height)
+
+        // Construct a range which is constant and half the profile FPS
+        val operatingFrameRate = profile.frameRate / 2
+        val operatingRange = Range(operatingFrameRate, operatingFrameRate)
+
+        val resolvedBitrate = VideoEncoderConfigVideoProfileResolver(
+            profile.mediaType,
+            timebase,
+            defaultVideoSpec,
+            surfaceSize,
+            profile,
+            operatingRange
+        ).get().bitrate
+
+        assertThat(resolvedBitrate).isEqualTo(
+            (profile.bitrate * (operatingFrameRate.toDouble() / profile.frameRate)).toInt()
+        )
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/workaround/EncoderFinderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/workaround/EncoderFinderTest.kt
index 72350dc..4af3517 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/workaround/EncoderFinderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/workaround/EncoderFinderTest.kt
@@ -37,7 +37,7 @@
 import androidx.camera.video.VideoSpec
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks
 import androidx.camera.video.internal.compat.quirk.MediaCodecInfoReportIncorrectInfoQuirk
-import androidx.camera.video.internal.config.VideoEncoderConfigCamcorderProfileResolver
+import androidx.camera.video.internal.config.VideoEncoderConfigVideoProfileResolver
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -144,7 +144,7 @@
 
     @LabTestRule.LabTestOnly
     @Test
-    fun findEncoderForFormat_CamcorderProfile() {
+    fun findEncoderForFormat_EncoderProfiles() {
         // Arrange.
         val cameraInfo = camera.cameraInfo as CameraInfoInternal
         val resolution = QualitySelector.getResolution(cameraInfo, quality)
@@ -153,18 +153,18 @@
             resolution != null
         )
 
-        val camcorderProfile = VideoCapabilities.from(cameraInfo).getProfile(quality)
-        val camcorderProfileVideoMime = camcorderProfile!!.videoCodecMimeType!!
+        val encoderProfiles = VideoCapabilities.from(cameraInfo).getProfiles(quality)
+        val videoProfile = encoderProfiles!!.defaultVideoProfile
 
         val videoSpec =
             VideoSpec.builder().setQualitySelector(QualitySelector.from(quality)).build()
 
-        val mediaFormat = VideoEncoderConfigCamcorderProfileResolver(
-            camcorderProfileVideoMime,
+        val mediaFormat = VideoEncoderConfigVideoProfileResolver(
+            videoProfile.mediaType,
             timebase,
             videoSpec,
             resolution!!,
-            camcorderProfile,
+            videoProfile,
             /*expectedFrameRateRange=*/null
         ).get().toMediaFormat()
 
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FallbackStrategy.java b/camera/camera-video/src/main/java/androidx/camera/video/FallbackStrategy.java
index e45ba08..ad3e94f 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FallbackStrategy.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FallbackStrategy.java
@@ -73,7 +73,7 @@
     }
 
     /**
-     * Returns a fallback strategy that will choose the quality that is closest to and higher
+     * Returns a fallback strategy that will choose the quality that is closest to and lower
      * than the input quality.
      */
     @NonNull
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java b/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
index ae10a14..a48f442 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
@@ -27,7 +27,8 @@
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
@@ -139,8 +140,9 @@
     @Nullable
     public static Size getResolution(@NonNull CameraInfo cameraInfo, @NonNull Quality quality) {
         checkQualityConstantsOrThrow(quality);
-        CamcorderProfileProxy profile = VideoCapabilities.from(cameraInfo).getProfile(quality);
-        return profile != null ? getProfileVideoSize(profile) : null;
+        VideoValidatedEncoderProfilesProxy profiles =
+                VideoCapabilities.from(cameraInfo).getProfiles(quality);
+        return profiles != null ? getProfileVideoSize(profiles) : null;
     }
 
     /**
@@ -156,7 +158,7 @@
         Map<Quality, Size> map = new HashMap<>();
         for (Quality supportedQuality : videoCapabilities.getSupportedQualities()) {
             map.put(supportedQuality, getProfileVideoSize(
-                    requireNonNull(videoCapabilities.getProfile(supportedQuality))));
+                    requireNonNull(videoCapabilities.getProfiles(supportedQuality))));
         }
         return map;
     }
@@ -404,8 +406,9 @@
     }
 
     @NonNull
-    private static Size getProfileVideoSize(@NonNull CamcorderProfileProxy profile) {
-        return new Size(profile.getVideoFrameWidth(), profile.getVideoFrameHeight());
+    private static Size getProfileVideoSize(@NonNull VideoValidatedEncoderProfilesProxy profiles) {
+        VideoProfileProxy videoProfile = profiles.getDefaultVideoProfile();
+        return new Size(videoProfile.getWidth(), videoProfile.getHeight());
     }
 
     private static void checkQualityConstantsOrThrow(@NonNull List<Quality> qualities) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
index 701b88d..78f4a24 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
@@ -59,7 +59,6 @@
 import androidx.camera.core.AspectRatio;
 import androidx.camera.core.Logger;
 import androidx.camera.core.SurfaceRequest;
-import androidx.camera.core.impl.CamcorderProfileProxy;
 import androidx.camera.core.impl.MutableStateObservable;
 import androidx.camera.core.impl.Observable;
 import androidx.camera.core.impl.StateObservable;
@@ -74,6 +73,7 @@
 import androidx.camera.video.StreamInfo.StreamState;
 import androidx.camera.video.internal.AudioSource;
 import androidx.camera.video.internal.AudioSourceAccessException;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.compat.Api26Impl;
 import androidx.camera.video.internal.compat.quirk.DeactivateEncoderSurfaceBeforeStopEncoderQuirk;
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
@@ -346,7 +346,7 @@
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     boolean mInProgressRecordingStopping = false;
     private SurfaceRequest.TransformationInfo mSurfaceTransformationInfo = null;
-    private CamcorderProfileProxy mResolvedCamcorderProfile = null;
+    private VideoValidatedEncoderProfilesProxy mResolvedEncoderProfiles = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final List<ListenableFuture<Void>> mEncodingFutures = new ArrayList<>();
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -1041,17 +1041,17 @@
         surfaceRequest.setTransformationInfoListener(mSequentialExecutor,
                 (transformationInfo) -> mSurfaceTransformationInfo = transformationInfo);
         Size surfaceSize = surfaceRequest.getResolution();
-        // Fetch and cache nearest camcorder profile, if one exists.
+        // Fetch and cache nearest encoder profiles, if one exists.
         VideoCapabilities capabilities =
                 VideoCapabilities.from(surfaceRequest.getCamera().getCameraInfo());
         Quality highestSupportedQuality = capabilities.findHighestSupportedQualityFor(surfaceSize);
         Logger.d(TAG, "Using supported quality of " + highestSupportedQuality
                 + " for surface size " + surfaceSize);
         if (highestSupportedQuality != Quality.NONE) {
-            mResolvedCamcorderProfile = capabilities.getProfile(highestSupportedQuality);
-            if (mResolvedCamcorderProfile == null) {
+            mResolvedEncoderProfiles = capabilities.getProfiles(highestSupportedQuality);
+            if (mResolvedEncoderProfiles == null) {
                 throw new AssertionError("Camera advertised available quality but did not "
-                        + "produce CamcorderProfile for advertised quality.");
+                        + "produce EncoderProfiles  for advertised quality.");
             }
         }
         setupVideo(surfaceRequest, videoSourceTimebase);
@@ -1071,7 +1071,7 @@
             MediaSpec mediaSpec = getObservableData(mMediaSpec);
             ListenableFuture<Encoder> configureFuture =
                     videoEncoderSession.configure(request, timebase, mediaSpec,
-                            mResolvedCamcorderProfile);
+                            mResolvedEncoderProfiles);
             mVideoEncoderSession = videoEncoderSession;
             Futures.addCallback(configureFuture, new FutureCallback<Encoder>() {
                 @Override
@@ -1237,7 +1237,7 @@
             throws AudioSourceAccessException, InvalidConfigException {
         MediaSpec mediaSpec = getObservableData(mMediaSpec);
         // Resolve the audio mime info
-        MimeInfo audioMimeInfo = resolveAudioMimeInfo(mediaSpec, mResolvedCamcorderProfile);
+        MimeInfo audioMimeInfo = resolveAudioMimeInfo(mediaSpec, mResolvedEncoderProfiles);
         Timebase audioSourceTimebase = Timebase.UPTIME;
 
         // Select and create the audio source
@@ -1377,7 +1377,7 @@
                 MediaSpec mediaSpec = getObservableData(mMediaSpec);
                 int muxerOutputFormat =
                         mediaSpec.getOutputFormat() == MediaSpec.OUTPUT_FORMAT_AUTO
-                                ? supportedMuxerFormatOrDefaultFrom(mResolvedCamcorderProfile,
+                                ? supportedMuxerFormatOrDefaultFrom(mResolvedEncoderProfiles,
                                 MediaSpec.outputFormatToMuxerFormat(
                                         MEDIA_SPEC_DEFAULT.getOutputFormat()))
                                 : MediaSpec.outputFormatToMuxerFormat(mediaSpec.getOutputFormat());
@@ -2566,9 +2566,9 @@
     }
 
     private static int supportedMuxerFormatOrDefaultFrom(
-            @Nullable CamcorderProfileProxy profileProxy, int defaultMuxerFormat) {
-        if (profileProxy != null) {
-            switch (profileProxy.getFileFormat()) {
+            @Nullable VideoValidatedEncoderProfilesProxy profilesProxy, int defaultMuxerFormat) {
+        if (profilesProxy != null) {
+            switch (profilesProxy.getRecommendedFileFormat()) {
                 case MediaRecorder.OutputFormat.MPEG_4:
                     return MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4;
                 case MediaRecorder.OutputFormat.WEBM:
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
index dfd3af6..a28a713 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
@@ -25,10 +25,14 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProvider;
-import androidx.camera.core.impl.CamcorderProfileProxy;
 import androidx.camera.core.impl.CameraInfoInternal;
+import androidx.camera.core.impl.EncoderProfilesProvider;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+import androidx.camera.core.impl.Quirks;
+import androidx.camera.core.impl.ResolutionValidatedEncoderProfilesProvider;
 import androidx.camera.core.impl.utils.CompareSizesByArea;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
 import androidx.camera.video.internal.compat.quirk.VideoQualityQuirk;
 import androidx.core.util.Preconditions;
@@ -54,55 +58,61 @@
     private static final String TAG = "VideoCapabilities";
 
     /**
-     * The supported @link CamcorderProfileProxy} map from quality to CamcorderProfileProxy. The
-     * order is from size large to small.
+     * Maps quality to supported {@link VideoValidatedEncoderProfilesProxy}. The order is from
+     * size large to small.
      */
-    private final Map<Quality, CamcorderProfileProxy> mSupportedProfileMap = new LinkedHashMap<>();
+    private final Map<Quality, VideoValidatedEncoderProfilesProxy> mSupportedProfilesMap =
+            new LinkedHashMap<>();
     private final TreeMap<Size, Quality> mAreaSortedSizeToQualityMap =
             new TreeMap<>(new CompareSizesByArea());
-    private final CamcorderProfileProxy mHighestProfile;
-    private final CamcorderProfileProxy mLowestProfile;
+    private final VideoValidatedEncoderProfilesProxy mHighestProfiles;
+    private final VideoValidatedEncoderProfilesProxy mLowestProfiles;
+    private final EncoderProfilesProvider mEncoderProfilesProvider;
 
     /**
      * Creates a VideoCapabilities.
      *
      * @param cameraInfoInternal the cameraInfo
      * @throws IllegalArgumentException if unable to get the capability information from the
-     * CameraInfo.
+     *                                  CameraInfo.
      */
     VideoCapabilities(@NonNull CameraInfoInternal cameraInfoInternal) {
-        CamcorderProfileProvider camcorderProfileProvider =
-                cameraInfoInternal.getCamcorderProfileProvider();
+        Quirks cameraQuirks = cameraInfoInternal.getCameraQuirks();
+        mEncoderProfilesProvider = new ResolutionValidatedEncoderProfilesProvider(
+                cameraInfoInternal.getEncoderProfilesProvider(), cameraQuirks);
 
         // Construct supported profile map
         for (Quality quality : Quality.getSortedQualities()) {
-            // SortedQualities is from size large to small
-            Preconditions.checkState(quality instanceof Quality.ConstantQuality,
-                    "Currently only support ConstantQuality");
-            int qualityValue = ((Quality.ConstantQuality) quality).getValue();
-
-            // Get CamcorderProfile
-            if (!camcorderProfileProvider.hasProfile(qualityValue) || !isDeviceValidQuality(
-                    cameraInfoInternal, quality)) {
+            EncoderProfilesProxy profiles = getEncoderProfiles(cameraInfoInternal, quality);
+            if (profiles == null) {
                 continue;
             }
-            CamcorderProfileProxy profile =
-                    Preconditions.checkNotNull(camcorderProfileProvider.get(qualityValue));
-            Size profileSize = new Size(profile.getVideoFrameWidth(),
-                    profile.getVideoFrameHeight());
-            Logger.d(TAG, "profile = " + profile);
-            mSupportedProfileMap.put(quality, profile);
-            mAreaSortedSizeToQualityMap.put(profileSize, quality);
+
+            // Validate that EncoderProfiles contain video information
+            Logger.d(TAG, "profiles = " + profiles);
+            VideoValidatedEncoderProfilesProxy validatedProfiles = toValidatedProfiles(profiles);
+            if (validatedProfiles == null) {
+                Logger.w(TAG, "EncoderProfiles of quality " + quality + " has no video "
+                        + "validated profiles.");
+                continue;
+            }
+
+            VideoProfileProxy videoProfile = validatedProfiles.getDefaultVideoProfile();
+            Size size = new Size(videoProfile.getWidth(), videoProfile.getHeight());
+            mAreaSortedSizeToQualityMap.put(size, quality);
+
+            // SortedQualities is from size large to small
+            mSupportedProfilesMap.put(quality, validatedProfiles);
         }
-        if (mSupportedProfileMap.isEmpty()) {
-            Logger.e(TAG, "No supported CamcorderProfile");
-            mLowestProfile = null;
-            mHighestProfile = null;
+        if (mSupportedProfilesMap.isEmpty()) {
+            Logger.e(TAG, "No supported EncoderProfiles");
+            mLowestProfiles = null;
+            mHighestProfiles = null;
         } else {
-            Deque<CamcorderProfileProxy> profileQueue = new ArrayDeque<>(
-                    mSupportedProfileMap.values());
-            mHighestProfile = profileQueue.peekFirst();
-            mLowestProfile = profileQueue.peekLast();
+            Deque<VideoValidatedEncoderProfilesProxy> profileQueue = new ArrayDeque<>(
+                    mSupportedProfilesMap.values());
+            mHighestProfiles = profileQueue.peekFirst();
+            mLowestProfiles = profileQueue.peekLast();
         }
     }
 
@@ -116,77 +126,78 @@
      * Gets all supported qualities on the device.
      *
      * <p>The returned list is sorted by quality size from large to small. For the qualities in
-     * the returned list, calling {@link #getProfile(Quality)} with these qualities will return a
+     * the returned list, calling {@link #getProfiles(Quality)} with these qualities will return a
      * non-null result.
      *
      * <p>Note: Constants {@link Quality#HIGHEST} and {@link Quality#LOWEST} are not included.
      */
     @NonNull
     public List<Quality> getSupportedQualities() {
-        return new ArrayList<>(mSupportedProfileMap.keySet());
+        return new ArrayList<>(mSupportedProfilesMap.keySet());
     }
 
     /**
      * Checks if the quality is supported.
      *
      * @param quality one of the quality constants. Possible values include
-     * {@link Quality#LOWEST}, {@link Quality#HIGHEST}, {@link Quality#SD},
-     * {@link Quality#HD}, {@link Quality#FHD}, or {@link Quality#UHD}.
+     *                {@link Quality#LOWEST}, {@link Quality#HIGHEST}, {@link Quality#SD},
+     *                {@link Quality#HD}, {@link Quality#FHD}, or {@link Quality#UHD}.
      * @return {@code true} if the quality is supported; {@code false} otherwise.
      * @throws IllegalArgumentException if not a quality constant.
      */
     public boolean isQualitySupported(@NonNull Quality quality) {
         checkQualityConstantsOrThrow(quality);
-        return getProfile(quality) != null;
+        return getProfiles(quality) != null;
     }
 
     /**
-     * Gets the corresponding {@link CamcorderProfileProxy} of the input quality.
+     * Gets the corresponding {@link VideoValidatedEncoderProfilesProxy} of the input quality.
      *
      * @param quality one of the quality constants. Possible values include
-     * {@link Quality#LOWEST}, {@link Quality#HIGHEST}, {@link Quality#SD}, {@link Quality#HD},
-     * {@link Quality#FHD}, or {@link Quality#UHD}.
-     * @return the CamcorderProfileProxy
+     *                {@link Quality#LOWEST}, {@link Quality#HIGHEST}, {@link Quality#SD},
+     *                {@link Quality#HD}, {@link Quality#FHD}, or {@link Quality#UHD}.
+     * @return the VideoValidatedEncoderProfilesProxy
      * @throws IllegalArgumentException if not a quality constant
      */
     @Nullable
-    public CamcorderProfileProxy getProfile(@NonNull Quality quality) {
+    public VideoValidatedEncoderProfilesProxy getProfiles(@NonNull Quality quality) {
         checkQualityConstantsOrThrow(quality);
         if (quality == Quality.HIGHEST) {
-            return mHighestProfile;
+            return mHighestProfiles;
         } else if (quality == Quality.LOWEST) {
-            return mLowestProfile;
+            return mLowestProfiles;
         }
-        return mSupportedProfileMap.get(quality);
+        return mSupportedProfilesMap.get(quality);
     }
 
     /**
-     * Finds the supported CamcorderProfileProxy with the resolution nearest to the given
+     * Finds the supported EncoderProfilesProxy with the resolution nearest to the given
      * {@link Size}.
      *
-     * <p>The supported CamcorderProfileProxy means the corresponding {@link Quality} is also
-     * supported. If the size aligns exactly with the pixel count of a CamcorderProfileProxy, that
-     * CamcorderProfileProxy will be selected. If the size falls between two
-     * CamcorderProfileProxy, the higher resolution will always be selected. Otherwise, the
-     * nearest CamcorderProfileProxy will be selected, whether that CamcorderProfileProxy's
-     * resolution is above or below the given size.
+     * <p>The supported EncoderProfilesProxy means the corresponding {@link Quality} is also
+     * supported. If the size aligns exactly with the pixel count of an EncoderProfilesProxy, that
+     * EncoderProfilesProxy will be selected. If the size falls between two EncoderProfilesProxy,
+     * the higher resolution will always be selected. Otherwise, the nearest EncoderProfilesProxy
+     * will be selected, whether that EncoderProfilesProxy's resolution is above or below the
+     * given size.
      *
      * @see #findHighestSupportedQualityFor(Size)
      */
     @Nullable
-    public CamcorderProfileProxy findHighestSupportedCamcorderProfileFor(@NonNull Size size) {
-        CamcorderProfileProxy camcorderProfile = null;
+    public VideoValidatedEncoderProfilesProxy findHighestSupportedEncoderProfilesFor(
+            @NonNull Size size) {
+        VideoValidatedEncoderProfilesProxy encoderProfiles = null;
         Quality highestSupportedQuality = findHighestSupportedQualityFor(size);
         Logger.d(TAG,
                 "Using supported quality of " + highestSupportedQuality + " for size " + size);
         if (highestSupportedQuality != Quality.NONE) {
-            camcorderProfile = getProfile(highestSupportedQuality);
-            if (camcorderProfile == null) {
+            encoderProfiles = getProfiles(highestSupportedQuality);
+            if (encoderProfiles == null) {
                 throw new AssertionError("Camera advertised available quality but did not "
-                        + "produce CamcorderProfile for advertised quality.");
+                        + "produce EncoderProfiles for advertised quality.");
             }
         }
-        return camcorderProfile;
+        return encoderProfiles;
     }
 
     /**
@@ -196,6 +207,7 @@
      * will be selected. If the size falls between two qualities, the higher quality will always
      * be selected. Otherwise, the nearest single quality will be selected, whether that
      * quality's size is above or below the given size.
+     *
      * @param size The size representing the number of pixels for comparison. Pixels are assumed
      *             to be square.
      * @return The quality constant defined in {@link Quality}. If no qualities are supported,
@@ -238,4 +250,30 @@
         return true;
     }
 
+    @Nullable
+    private EncoderProfilesProxy getEncoderProfiles(@NonNull CameraInfoInternal cameraInfo,
+            @NonNull Quality quality) {
+        Preconditions.checkState(quality instanceof Quality.ConstantQuality,
+                "Currently only support ConstantQuality");
+        int qualityValue = ((Quality.ConstantQuality) quality).getValue();
+
+        if (!mEncoderProfilesProvider.hasProfile(qualityValue) || !isDeviceValidQuality(cameraInfo,
+                quality)) {
+            return null;
+        }
+
+        return mEncoderProfilesProvider.getAll(qualityValue);
+    }
+
+    @Nullable
+    private VideoValidatedEncoderProfilesProxy toValidatedProfiles(
+            @NonNull EncoderProfilesProxy profiles) {
+        // According to the document, the first profile is the default video profile.
+        List<VideoProfileProxy> videoProfiles = profiles.getVideoProfiles();
+        if (videoProfiles.isEmpty()) {
+            return null;
+        }
+
+        return VideoValidatedEncoderProfilesProxy.from(profiles);
+    }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index 1d5fad6..3c0a5fa 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -73,7 +73,6 @@
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
-import androidx.camera.core.impl.CamcorderProfileProxy;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.CameraInfoInternal;
@@ -101,10 +100,10 @@
 import androidx.camera.core.internal.ThreadConfig;
 import androidx.camera.core.processing.DefaultSurfaceProcessor;
 import androidx.camera.core.processing.SurfaceEdge;
-import androidx.camera.core.processing.SurfaceProcessorInternal;
 import androidx.camera.core.processing.SurfaceProcessorNode;
 import androidx.camera.video.StreamInfo.StreamState;
 import androidx.camera.video.impl.VideoCaptureConfig;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
 import androidx.camera.video.internal.compat.quirk.ExtraSupportedResolutionQuirk;
 import androidx.camera.video.internal.compat.quirk.ImageCaptureFailedWhenVideoCaptureIsBoundQuirk;
@@ -194,8 +193,6 @@
     @SuppressWarnings("WeakerAccess") // Synthetic access
     VideoOutput.SourceState mSourceState = VideoOutput.SourceState.INACTIVE;
     @Nullable
-    private SurfaceProcessorInternal mSurfaceProcessor;
-    @Nullable
     private SurfaceProcessorNode mNode;
     @Nullable
     private VideoEncoderInfo mVideoEncoderInfo;
@@ -311,21 +308,6 @@
     }
 
     /**
-     * Sets a {@link SurfaceProcessorInternal}.
-     *
-     * <p>The processor is used to setup post-processing pipeline.
-     *
-     * <p>Note: the value will only be used when VideoCapture is bound. Calling this method after
-     * VideoCapture is bound takes no effect until VideoCapture is rebound.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public void setProcessor(@Nullable SurfaceProcessorInternal surfaceProcessor) {
-        mSurfaceProcessor = surfaceProcessor;
-    }
-
-    /**
      * {@inheritDoc}
      *
      * @hide
@@ -719,10 +701,10 @@
 
     @Nullable
     private SurfaceProcessorNode createNodeIfNeeded(boolean isCropNeeded) {
-        if (mSurfaceProcessor != null || ENABLE_SURFACE_PROCESSING_BY_QUIRK || isCropNeeded) {
+        if (getEffect() != null || ENABLE_SURFACE_PROCESSING_BY_QUIRK || isCropNeeded) {
             Logger.d(TAG, "Surface processing is enabled.");
             return new SurfaceProcessorNode(requireNonNull(getCamera()),
-                    mSurfaceProcessor != null ? mSurfaceProcessor :
+                    getEffect() != null ? getEffect().createSurfaceProcessorInternal() :
                             DefaultSurfaceProcessor.Factory.newInstance());
         }
         return null;
@@ -897,11 +879,11 @@
             return mVideoEncoderInfo;
         }
 
-        // Find the nearest CamcorderProfile
-        CamcorderProfileProxy camcorderProfileProxy =
-                videoCapabilities.findHighestSupportedCamcorderProfileFor(resolution);
+        // Find the nearest EncoderProfiles
+        VideoValidatedEncoderProfilesProxy encoderProfiles =
+                videoCapabilities.findHighestSupportedEncoderProfilesFor(resolution);
         VideoEncoderInfo videoEncoderInfo = resolveVideoEncoderInfo(videoEncoderInfoFinder,
-                camcorderProfileProxy, mediaSpec, resolution, targetFps);
+                encoderProfiles, mediaSpec, resolution, targetFps);
         if (videoEncoderInfo == null) {
             // If VideoCapture cannot find videoEncoderInfo, it means that VideoOutput should
             // also not be able to find the encoder. VideoCapture will not handle this situation
@@ -910,9 +892,9 @@
             return null;
         }
 
-        Size profileSize = camcorderProfileProxy != null ? new Size(
-                camcorderProfileProxy.getVideoFrameWidth(),
-                camcorderProfileProxy.getVideoFrameHeight()) : null;
+        Size profileSize = encoderProfiles != null ? new Size(
+                encoderProfiles.getDefaultVideoProfile().getWidth(),
+                encoderProfiles.getDefaultVideoProfile().getHeight()) : null;
         videoEncoderInfo = VideoEncoderInfoWrapper.from(videoEncoderInfo, profileSize);
 
         // Cache the VideoEncoderInfo as it should be the same when recreating the pipeline.
@@ -926,12 +908,12 @@
     @Nullable
     private static VideoEncoderInfo resolveVideoEncoderInfo(
             @NonNull Function<VideoEncoderConfig, VideoEncoderInfo> videoEncoderInfoFinder,
-            @Nullable CamcorderProfileProxy camcorderProfileProxy,
+            @Nullable VideoValidatedEncoderProfilesProxy encoderProfiles,
             @NonNull MediaSpec mediaSpec,
             @NonNull Size resolution,
             @NonNull Range<Integer> targetFps) {
         // Resolve the VideoEncoderConfig
-        MimeInfo videoMimeInfo = resolveVideoMimeInfo(mediaSpec, camcorderProfileProxy);
+        MimeInfo videoMimeInfo = resolveVideoMimeInfo(mediaSpec, encoderProfiles);
         VideoEncoderConfig videoEncoderConfig = resolveVideoEncoderConfig(
                 videoMimeInfo,
                 // Timebase won't affect the found EncoderInfo so give a arbitrary one.
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoEncoderSession.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoEncoderSession.java
index abc597f..9b9d46c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoEncoderSession.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoEncoderSession.java
@@ -16,8 +16,9 @@
 
 package androidx.camera.video;
 
-import android.util.Range;
-import android.util.Size;
+import static androidx.camera.video.internal.config.VideoConfigUtil.resolveVideoEncoderConfig;
+import static androidx.camera.video.internal.config.VideoConfigUtil.resolveVideoMimeInfo;
+
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
@@ -25,21 +26,18 @@
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
 import androidx.camera.core.SurfaceRequest;
-import androidx.camera.core.impl.CamcorderProfileProxy;
 import androidx.camera.core.impl.Timebase;
 import androidx.camera.core.impl.annotation.ExecutedBy;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.config.MimeInfo;
-import androidx.camera.video.internal.config.VideoEncoderConfigCamcorderProfileResolver;
-import androidx.camera.video.internal.config.VideoEncoderConfigDefaultResolver;
 import androidx.camera.video.internal.encoder.Encoder;
 import androidx.camera.video.internal.encoder.Encoder.SurfaceInput.OnSurfaceUpdateListener;
 import androidx.camera.video.internal.encoder.EncoderFactory;
 import androidx.camera.video.internal.encoder.InvalidConfigException;
 import androidx.camera.video.internal.encoder.VideoEncoderConfig;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
-import androidx.core.util.Supplier;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -109,7 +107,7 @@
     @ExecutedBy("mSequentialExecutor")
     ListenableFuture<Encoder> configure(@NonNull SurfaceRequest surfaceRequest,
             @NonNull Timebase timebase, @NonNull MediaSpec mediaSpec,
-            @Nullable CamcorderProfileProxy resolvedCamcorderProfile) {
+            @Nullable VideoValidatedEncoderProfilesProxy resolvedEncoderProfiles) {
         switch (mVideoEncoderState) {
             case NOT_INITIALIZED:
                 mVideoEncoderState = VideoEncoderState.INITIALIZING;
@@ -127,7 +125,7 @@
                 ListenableFuture<Encoder> configureFuture = CallbackToFutureAdapter.getFuture(
                         completer -> {
                             configureVideoEncoderInternal(surfaceRequest, timebase,
-                                    resolvedCamcorderProfile,
+                                    resolvedEncoderProfiles,
                                     mediaSpec, completer);
                             return "ConfigureVideoEncoderFuture " + VideoEncoderSession.this;
                         });
@@ -286,10 +284,10 @@
     @ExecutedBy("mSequentialExecutor")
     private void configureVideoEncoderInternal(@NonNull SurfaceRequest surfaceRequest,
             @NonNull Timebase timebase,
-            @Nullable CamcorderProfileProxy resolvedCamcorderProfile,
+            @Nullable VideoValidatedEncoderProfilesProxy resolvedEncoderProfiles,
             @NonNull MediaSpec mediaSpec,
             @NonNull CallbackToFutureAdapter.Completer<Encoder> configureCompleter) {
-        MimeInfo videoMimeInfo = resolveVideoMimeInfo(resolvedCamcorderProfile, mediaSpec);
+        MimeInfo videoMimeInfo = resolveVideoMimeInfo(mediaSpec, resolvedEncoderProfiles);
 
         // The VideoSpec from mediaSpec only contains settings requested by the recorder, but
         // the actual settings may need to differ depending on the FPS chosen by the camera.
@@ -371,69 +369,6 @@
         }
     }
 
-    @ExecutedBy("mSequentialExecutor")
-    private MimeInfo resolveVideoMimeInfo(@Nullable CamcorderProfileProxy resolvedCamcorderProfile,
-            @NonNull MediaSpec mediaSpec) {
-        String mediaSpecVideoMime = MediaSpec.outputFormatToVideoMime(mediaSpec.getOutputFormat());
-        String resolvedVideoMime = mediaSpecVideoMime;
-        boolean camcorderProfileIsCompatible = false;
-        if (resolvedCamcorderProfile != null) {
-            String camcorderProfileVideoMime = resolvedCamcorderProfile.getVideoCodecMimeType();
-            // Use camcorder profile settings if the media spec's output format
-            // is set to auto or happens to match the CamcorderProfile's output format.
-            if (camcorderProfileVideoMime == null) {
-                Logger.d(TAG, "CamcorderProfile contains undefined VIDEO mime type so cannot be "
-                        + "used. May rely on fallback defaults to derive settings "
-                        + "[chosen mime type: " + resolvedVideoMime + "]");
-            } else if (mediaSpec.getOutputFormat() == MediaSpec.OUTPUT_FORMAT_AUTO) {
-                camcorderProfileIsCompatible = true;
-                resolvedVideoMime = camcorderProfileVideoMime;
-                Logger.d(TAG, "MediaSpec contains OUTPUT_FORMAT_AUTO. Using CamcorderProfile "
-                        + "to derive VIDEO settings [mime type: " + resolvedVideoMime + "]");
-            } else if (Objects.equals(mediaSpecVideoMime, camcorderProfileVideoMime)) {
-                camcorderProfileIsCompatible = true;
-                resolvedVideoMime = camcorderProfileVideoMime;
-                Logger.d(TAG, "MediaSpec video mime matches CamcorderProfile. Using "
-                        + "CamcorderProfile to derive VIDEO settings [mime type: "
-                        + resolvedVideoMime + "]");
-            } else {
-                Logger.d(TAG, "MediaSpec video mime does not match CamcorderProfile, so "
-                        + "CamcorderProfile settings cannot be used. May rely on fallback "
-                        + "defaults to derive VIDEO settings [CamcorderProfile mime type: "
-                        + camcorderProfileVideoMime + ", chosen mime type: " + resolvedVideoMime
-                        + "]");
-            }
-        } else {
-            Logger.d(TAG, "No CamcorderProfile present. May rely on fallback defaults to derive "
-                    + "VIDEO settings [chosen mime type: " + resolvedVideoMime + "]");
-        }
-
-        MimeInfo.Builder mimeInfoBuilder = MimeInfo.builder(resolvedVideoMime);
-        if (camcorderProfileIsCompatible) {
-            mimeInfoBuilder.setCompatibleCamcorderProfile(resolvedCamcorderProfile);
-        }
-
-        return mimeInfoBuilder.build();
-    }
-
-    @NonNull
-    private static VideoEncoderConfig resolveVideoEncoderConfig(@NonNull MimeInfo videoMimeInfo,
-            @NonNull Timebase timebase, @NonNull VideoSpec videoSpec, @NonNull Size surfaceSize,
-            @Nullable Range<Integer> expectedFrameRateRange) {
-        Supplier<VideoEncoderConfig> configSupplier;
-        if (videoMimeInfo.getCompatibleCamcorderProfile() != null) {
-            configSupplier = new VideoEncoderConfigCamcorderProfileResolver(
-                    videoMimeInfo.getMimeType(), timebase, videoSpec, surfaceSize,
-                    videoMimeInfo.getCompatibleCamcorderProfile(),
-                    expectedFrameRateRange);
-        } else {
-            configSupplier = new VideoEncoderConfigDefaultResolver(videoMimeInfo.getMimeType(),
-                    timebase, videoSpec, surfaceSize, expectedFrameRateRange);
-        }
-
-        return configSupplier.get();
-    }
-
     @NonNull
     @Override
     public String toString() {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxy.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxy.java
new file mode 100644
index 0000000..025c0c2
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxy.java
@@ -0,0 +1,84 @@
+/*
+ * 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.video.internal;
+
+import static java.util.Collections.unmodifiableList;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.EncoderProfilesProxy;
+import androidx.core.util.Preconditions;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * VideoValidatedEncoderProfilesProxy is an implementation of {@link EncoderProfilesProxy} that
+ * guarantees to provide video information.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+@AutoValue
+public abstract class VideoValidatedEncoderProfilesProxy implements EncoderProfilesProxy {
+
+    /** Creates a VideoValidatedEncoderProfilesProxy instance from {@link EncoderProfilesProxy}. */
+    @NonNull
+    public static VideoValidatedEncoderProfilesProxy from(@NonNull EncoderProfilesProxy profiles) {
+        return create(
+                profiles.getDefaultDurationSeconds(),
+                profiles.getRecommendedFileFormat(),
+                profiles.getAudioProfiles(),
+                profiles.getVideoProfiles()
+        );
+    }
+
+    /** Creates a VideoValidatedEncoderProfilesProxy instance. */
+    @NonNull
+    public static VideoValidatedEncoderProfilesProxy create(
+            int defaultDurationSeconds,
+            int recommendedFileFormat,
+            @NonNull List<AudioProfileProxy> audioProfiles,
+            @NonNull List<VideoProfileProxy> videoProfiles) {
+        Preconditions.checkArgument(!videoProfiles.isEmpty(),
+                "Should contain at least one VideoProfile.");
+        VideoProfileProxy defaultVideoProfile = videoProfiles.get(0);
+
+        AudioProfileProxy defaultAudioProfile = null;
+        if (!audioProfiles.isEmpty()) {
+            defaultAudioProfile = audioProfiles.get(0);
+        }
+
+        return new AutoValue_VideoValidatedEncoderProfilesProxy(
+                defaultDurationSeconds,
+                recommendedFileFormat,
+                unmodifiableList(new ArrayList<>(audioProfiles)),
+                unmodifiableList(new ArrayList<>(videoProfiles)),
+                defaultAudioProfile,
+                defaultVideoProfile
+        );
+    }
+
+    /** Returns the default {@link AudioProfileProxy} or null if not existed. */
+    @Nullable
+    public abstract AudioProfileProxy getDefaultAudioProfile();
+
+    /** Returns the default {@link VideoProfileProxy}. */
+    @NonNull
+    public abstract VideoProfileProxy getDefaultVideoProfile();
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ReportedVideoQualityNotSupportedQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ReportedVideoQualityNotSupportedQuirk.java
index acf2bd5..d4bf9fe 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ReportedVideoQualityNotSupportedQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ReportedVideoQualityNotSupportedQuirk.java
@@ -25,7 +25,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.impl.CamcorderProfileProvider;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.video.Quality;
 
@@ -33,7 +32,7 @@
 import java.util.Locale;
 
 /**
- * Quirk where qualities reported as available by {@link CamcorderProfileProvider#hasProfile(int)}
+ * Quirk where qualities reported as available by {@link CamcorderProfile#hasProfile(int)}
  * does not work on the device, and should not be used.
  *
  * <p>QuirkSummary
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioConfigUtil.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioConfigUtil.java
index 61bea4c..9979dd5 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioConfigUtil.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioConfigUtil.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.video.internal.config;
 
+import static java.util.Objects.requireNonNull;
+
 import android.util.Range;
 import android.util.Rational;
 
@@ -23,11 +25,12 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
 import androidx.camera.core.impl.Timebase;
 import androidx.camera.video.AudioSpec;
 import androidx.camera.video.MediaSpec;
 import androidx.camera.video.internal.AudioSource;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.encoder.AudioEncoderConfig;
 import androidx.core.util.Supplier;
 
@@ -60,48 +63,48 @@
      * Resolves the audio mime information into a {@link MimeInfo}.
      *
      * @param mediaSpec        the media spec to resolve the mime info.
-     * @param camcorderProfile the camcorder profile to resolve the mime info. It can be null if
-     *                         there is no relevant camcorder profile.
+     * @param encoderProfiles  the encoder profiles to resolve the mime info. It can be null if
+     *                         there is no relevant encoder profiles.
      * @return the audio MimeInfo.
      */
     @NonNull
     public static MimeInfo resolveAudioMimeInfo(@NonNull MediaSpec mediaSpec,
-            @Nullable CamcorderProfileProxy camcorderProfile) {
+            @Nullable VideoValidatedEncoderProfilesProxy encoderProfiles) {
         String mediaSpecAudioMime = MediaSpec.outputFormatToAudioMime(mediaSpec.getOutputFormat());
         int mediaSpecAudioProfile =
                 MediaSpec.outputFormatToAudioProfile(mediaSpec.getOutputFormat());
         String resolvedAudioMime = mediaSpecAudioMime;
         int resolvedAudioProfile = mediaSpecAudioProfile;
-        boolean camcorderProfileIsCompatible = false;
-        if (camcorderProfile != null) {
-            String camcorderProfileAudioMime = camcorderProfile.getAudioCodecMimeType();
-            int camcorderProfileAudioProfile = camcorderProfile.getRequiredAudioProfile();
+        boolean encoderProfilesIsCompatible = false;
+        if (encoderProfiles != null && encoderProfiles.getDefaultAudioProfile() != null) {
+            AudioProfileProxy audioProfile = encoderProfiles.getDefaultAudioProfile();
+            String encoderProfileAudioMime = audioProfile.getMediaType();
+            int encoderProfileAudioProfile = audioProfile.getProfile();
 
-            if (camcorderProfileAudioMime == null) {
-                Logger.d(TAG, "CamcorderProfile contains undefined AUDIO mime type so cannot be "
+            if (Objects.equals(encoderProfileAudioMime, AudioProfileProxy.MEDIA_TYPE_NONE)) {
+                Logger.d(TAG, "EncoderProfiles contains undefined AUDIO mime type so cannot be "
                         + "used. May rely on fallback defaults to derive settings [chosen mime "
                         + "type: "
                         + resolvedAudioMime + "(profile: " + resolvedAudioProfile + ")]");
             } else if (mediaSpec.getOutputFormat() == MediaSpec.OUTPUT_FORMAT_AUTO) {
-                camcorderProfileIsCompatible = true;
-                resolvedAudioMime = camcorderProfileAudioMime;
-                resolvedAudioProfile = camcorderProfileAudioProfile;
-                Logger.d(TAG, "MediaSpec contains OUTPUT_FORMAT_AUTO. Using CamcorderProfile "
+                encoderProfilesIsCompatible = true;
+                resolvedAudioMime = encoderProfileAudioMime;
+                resolvedAudioProfile = encoderProfileAudioProfile;
+                Logger.d(TAG, "MediaSpec contains OUTPUT_FORMAT_AUTO. Using EncoderProfiles "
                         + "to derive AUDIO settings [mime type: "
                         + resolvedAudioMime + "(profile: " + resolvedAudioProfile + ")]");
-            } else if (Objects.equals(mediaSpecAudioMime, camcorderProfileAudioMime)
-                    && mediaSpecAudioProfile == camcorderProfileAudioProfile) {
-                camcorderProfileIsCompatible = true;
-                resolvedAudioMime = camcorderProfileAudioMime;
-                resolvedAudioProfile = camcorderProfileAudioProfile;
-                Logger.d(TAG, "MediaSpec audio mime/profile matches CamcorderProfile. "
-                        + "Using CamcorderProfile to derive AUDIO settings [mime type: "
+            } else if (Objects.equals(mediaSpecAudioMime, encoderProfileAudioMime)
+                    && mediaSpecAudioProfile == encoderProfileAudioProfile) {
+                encoderProfilesIsCompatible = true;
+                resolvedAudioMime = encoderProfileAudioMime;
+                Logger.d(TAG, "MediaSpec audio mime/profile matches EncoderProfiles. "
+                        + "Using EncoderProfiles to derive AUDIO settings [mime type: "
                         + resolvedAudioMime + "(profile: " + resolvedAudioProfile + ")]");
             } else {
-                Logger.d(TAG, "MediaSpec audio mime or profile does not match CamcorderProfile, so "
-                        + "CamcorderProfile settings cannot be used. May rely on fallback "
-                        + "defaults to derive AUDIO settings [CamcorderProfile mime type: "
-                        + camcorderProfileAudioMime + "(profile: " + camcorderProfileAudioProfile
+                Logger.d(TAG, "MediaSpec audio mime or profile does not match EncoderProfiles, so "
+                        + "EncoderProfiles settings cannot be used. May rely on fallback defaults"
+                        + " to derive AUDIO settings [EncoderProfiles mime type: "
+                        + encoderProfileAudioMime + "(profile: " + encoderProfileAudioProfile
                         + "), chosen mime type: "
                         + resolvedAudioMime + "(profile: " + resolvedAudioProfile + ")]");
             }
@@ -109,8 +112,8 @@
 
         MimeInfo.Builder mimeInfoBuilder = MimeInfo.builder(resolvedAudioMime)
                 .setProfile(resolvedAudioProfile);
-        if (camcorderProfileIsCompatible) {
-            mimeInfoBuilder.setCompatibleCamcorderProfile(camcorderProfile);
+        if (encoderProfilesIsCompatible) {
+            mimeInfoBuilder.setCompatibleEncoderProfiles(encoderProfiles);
         }
 
         return mimeInfoBuilder.build();
@@ -127,9 +130,10 @@
     public static AudioSource.Settings resolveAudioSourceSettings(@NonNull MimeInfo audioMimeInfo,
             @NonNull AudioSpec audioSpec) {
         Supplier<AudioSource.Settings> settingsSupplier;
-        if (audioMimeInfo.getCompatibleCamcorderProfile() != null) {
-            settingsSupplier = new AudioSourceSettingsCamcorderProfileResolver(audioSpec,
-                    audioMimeInfo.getCompatibleCamcorderProfile());
+        VideoValidatedEncoderProfilesProxy profiles = audioMimeInfo.getCompatibleEncoderProfiles();
+        if (profiles != null) {
+            AudioProfileProxy audioProfile = requireNonNull(profiles.getDefaultAudioProfile());
+            settingsSupplier = new AudioSourceSettingsAudioProfileResolver(audioSpec, audioProfile);
         } else {
             settingsSupplier = new AudioSourceSettingsDefaultResolver(audioSpec);
         }
@@ -151,10 +155,12 @@
             @NonNull Timebase inputTimebase, @NonNull AudioSource.Settings audioSourceSettings,
             @NonNull AudioSpec audioSpec) {
         Supplier<AudioEncoderConfig> configSupplier;
-        if (audioMimeInfo.getCompatibleCamcorderProfile() != null) {
-            configSupplier = new AudioEncoderConfigCamcorderProfileResolver(
+        VideoValidatedEncoderProfilesProxy profiles = audioMimeInfo.getCompatibleEncoderProfiles();
+        if (profiles != null) {
+            AudioProfileProxy audioProfile = requireNonNull(profiles.getDefaultAudioProfile());
+            configSupplier = new AudioEncoderConfigAudioProfileResolver(
                     audioMimeInfo.getMimeType(), audioMimeInfo.getProfile(), inputTimebase,
-                    audioSpec, audioSourceSettings, audioMimeInfo.getCompatibleCamcorderProfile());
+                    audioSpec, audioSourceSettings, audioProfile);
         } else {
             configSupplier = new AudioEncoderConfigDefaultResolver(audioMimeInfo.getMimeType(),
                     audioMimeInfo.getProfile(), inputTimebase, audioSpec, audioSourceSettings);
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolver.java
new file mode 100644
index 0000000..167050f
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigAudioProfileResolver.java
@@ -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.camera.video.internal.config;
+
+
+import android.util.Range;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.core.impl.Timebase;
+import androidx.camera.video.AudioSpec;
+import androidx.camera.video.internal.AudioSource;
+import androidx.camera.video.internal.encoder.AudioEncoderConfig;
+import androidx.core.util.Supplier;
+
+/**
+ * An {@link AudioEncoderConfig} supplier that resolves requested encoder settings from an
+ * {@link AudioSpec} for the given {@link AudioSource.Settings} using the provided
+ * {@link AudioProfileProxy}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class AudioEncoderConfigAudioProfileResolver implements
+        Supplier<AudioEncoderConfig> {
+
+    private static final String TAG = "AudioEncAdPrflRslvr";
+
+    private final String mMimeType;
+    private final Timebase mInputTimebase;
+    private final int mAudioProfile;
+    private final AudioSpec mAudioSpec;
+    private final AudioSource.Settings mAudioSourceSettings;
+    private final AudioProfileProxy mAudioProfileProxy;
+
+    /**
+     * Constructor for an AudioEncoderConfigAudioProfileResolver.
+     *
+     * @param mimeType            The mime type for the audio encoder
+     * @param audioProfile        The profile required for the audio encoder
+     * @param inputTimebase       The timebase of the input frame
+     * @param audioSpec           The {@link AudioSpec} which defines the settings that should be
+     *                            used with the audio encoder.
+     * @param audioSourceSettings The settings used to configure the source of audio.
+     * @param audioProfileProxy   The {@link AudioProfileProxy} used to resolve automatic and
+     *                            range settings.
+     */
+    public AudioEncoderConfigAudioProfileResolver(@NonNull String mimeType,
+            int audioProfile, @NonNull Timebase inputTimebase, @NonNull AudioSpec audioSpec,
+            @NonNull AudioSource.Settings audioSourceSettings,
+            @NonNull AudioProfileProxy audioProfileProxy) {
+        mMimeType = mimeType;
+        mAudioProfile = audioProfile;
+        mInputTimebase = inputTimebase;
+        mAudioSpec = audioSpec;
+        mAudioSourceSettings = audioSourceSettings;
+        mAudioProfileProxy = audioProfileProxy;
+    }
+
+    @Override
+    @NonNull
+    public AudioEncoderConfig get() {
+        Logger.d(TAG, "Using resolved AUDIO bitrate from AudioProfile");
+        Range<Integer> audioSpecBitrateRange = mAudioSpec.getBitrate();
+        int resolvedBitrate = AudioConfigUtil.scaleAndClampBitrate(
+                mAudioProfileProxy.getBitrate(),
+                mAudioSourceSettings.getChannelCount(), mAudioProfileProxy.getChannels(),
+                mAudioSourceSettings.getSampleRate(), mAudioProfileProxy.getSampleRate(),
+                audioSpecBitrateRange);
+
+        return AudioEncoderConfig.builder()
+                .setMimeType(mMimeType)
+                .setProfile(mAudioProfile)
+                .setInputTimebase(mInputTimebase)
+                .setChannelCount(mAudioSourceSettings.getChannelCount())
+                .setSampleRate(mAudioSourceSettings.getSampleRate())
+                .setBitrate(resolvedBitrate)
+                .build();
+    }
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolver.java
deleted file mode 100644
index 21d59a3..0000000
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioEncoderConfigCamcorderProfileResolver.java
+++ /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.camera.video.internal.config;
-
-
-import android.util.Range;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-import androidx.camera.core.impl.Timebase;
-import androidx.camera.video.AudioSpec;
-import androidx.camera.video.internal.AudioSource;
-import androidx.camera.video.internal.encoder.AudioEncoderConfig;
-import androidx.core.util.Supplier;
-
-/**
- * An {@link AudioEncoderConfig} supplier that resolves requested encoder settings from an
- * {@link AudioSpec} for the given {@link AudioSource.Settings} using the provided
- * {@link CamcorderProfileProxy}.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class AudioEncoderConfigCamcorderProfileResolver implements
-        Supplier<AudioEncoderConfig> {
-
-    private static final String TAG = "AudioEncCmcrdrPrflRslvr";
-
-    private final String mMimeType;
-    private final Timebase mInputTimebase;
-    private final int mAudioProfile;
-    private final AudioSpec mAudioSpec;
-    private final AudioSource.Settings mAudioSourceSettings;
-    private final CamcorderProfileProxy mCamcorderProfile;
-
-    /**
-     * Constructor for an AudioEncoderConfigCamcorderProfileResolver.
-     *
-     * @param mimeType            The mime type for the audio encoder
-     * @param audioProfile        The profile required for the audio encoder
-     * @param inputTimebase       The timebase of the input frame
-     * @param audioSpec           The {@link AudioSpec} which defines the settings that should be
-     *                            used with the audio encoder.
-     * @param audioSourceSettings The settings used to configure the source of audio.
-     * @param camcorderProfile    The {@link CamcorderProfileProxy} used to resolve automatic and
-     *                            range settings.
-     */
-    public AudioEncoderConfigCamcorderProfileResolver(@NonNull String mimeType,
-            int audioProfile, @NonNull Timebase inputTimebase, @NonNull AudioSpec audioSpec,
-            @NonNull AudioSource.Settings audioSourceSettings,
-            @NonNull CamcorderProfileProxy camcorderProfile) {
-        mMimeType = mimeType;
-        mAudioProfile = audioProfile;
-        mInputTimebase = inputTimebase;
-        mAudioSpec = audioSpec;
-        mAudioSourceSettings = audioSourceSettings;
-        mCamcorderProfile = camcorderProfile;
-    }
-
-    @Override
-    @NonNull
-    public AudioEncoderConfig get() {
-        Logger.d(TAG, "Using resolved AUDIO bitrate from CamcorderProfile");
-        Range<Integer> audioSpecBitrateRange = mAudioSpec.getBitrate();
-        int resolvedBitrate = AudioConfigUtil.scaleAndClampBitrate(
-                mCamcorderProfile.getAudioBitRate(),
-                mAudioSourceSettings.getChannelCount(), mCamcorderProfile.getAudioChannels(),
-                mAudioSourceSettings.getSampleRate(), mCamcorderProfile.getAudioSampleRate(),
-                audioSpecBitrateRange);
-
-        return AudioEncoderConfig.builder()
-                .setMimeType(mMimeType)
-                .setProfile(mAudioProfile)
-                .setInputTimebase(mInputTimebase)
-                .setChannelCount(mAudioSourceSettings.getChannelCount())
-                .setSampleRate(mAudioSourceSettings.getSampleRate())
-                .setBitrate(resolvedBitrate)
-                .build();
-    }
-}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolver.java
new file mode 100644
index 0000000..4b29d22
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsAudioProfileResolver.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.config;
+
+import android.util.Range;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesProxy.AudioProfileProxy;
+import androidx.camera.video.AudioSpec;
+import androidx.camera.video.internal.AudioSource;
+import androidx.core.util.Supplier;
+
+/**
+ * An {@link AudioSource.Settings} supplier that resolves requested source settings from an
+ * {@link AudioSpec} using an {@link AudioProfileProxy}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class AudioSourceSettingsAudioProfileResolver implements
+        Supplier<AudioSource.Settings> {
+
+    private static final String TAG = "AudioSrcAdPrflRslvr";
+
+    private final AudioSpec mAudioSpec;
+    private final AudioProfileProxy mAudioProfile;
+
+    /**
+     * Constructor for an AudioSourceSettingsAudioProfileResolver.
+     *
+     * @param audioProfile  The {@link AudioProfileProxy} used to resolve automatic and range
+     *                      settings.
+     * @param audioSpec     The {@link AudioSpec} which defines the settings that should be used
+     *                      with the audio source.
+     */
+    public AudioSourceSettingsAudioProfileResolver(@NonNull AudioSpec audioSpec,
+            @NonNull AudioProfileProxy audioProfile) {
+        mAudioSpec = audioSpec;
+        mAudioProfile = audioProfile;
+    }
+
+    @Override
+    @NonNull
+    public AudioSource.Settings get() {
+        // Resolve audio source
+        int resolvedAudioSource = AudioConfigUtil.resolveAudioSource(mAudioSpec);
+
+        // Resolve source format
+        int resolvedSourceFormat = AudioConfigUtil.resolveAudioSourceFormat(
+                mAudioSpec);
+
+        int audioSpecChannelCount = mAudioSpec.getChannelCount();
+        Range<Integer> audioSpecSampleRate = mAudioSpec.getSampleRate();
+        int resolvedSampleRate;
+        int resolvedChannelCount;
+        int audioProfileChannelCount = mAudioProfile.getChannels();
+        if (audioSpecChannelCount == AudioSpec.CHANNEL_COUNT_AUTO) {
+            resolvedChannelCount = audioProfileChannelCount;
+            Logger.d(TAG, "Resolved AUDIO channel count from AudioProfile: "
+                    + resolvedChannelCount);
+        } else {
+            resolvedChannelCount = audioSpecChannelCount;
+            Logger.d(TAG, "Media spec AUDIO channel count overrides AudioProfile "
+                    + "[AudioProfile channel count: " + audioProfileChannelCount
+                    + ", Resolved Channel Count: " + resolvedChannelCount + "]");
+        }
+
+        int audioProfileSampleRate = mAudioProfile.getSampleRate();
+        resolvedSampleRate = AudioConfigUtil.selectSampleRateOrNearestSupported(
+                audioSpecSampleRate, resolvedChannelCount, resolvedSourceFormat,
+                audioProfileSampleRate);
+        Logger.d(TAG, "Using resolved AUDIO sample rate or nearest supported from "
+                + "AudioProfile: " + resolvedSampleRate + "Hz. [AudioProfile sample rate: "
+                + audioProfileSampleRate + "Hz]");
+
+        return AudioSource.Settings.builder()
+                .setAudioSource(resolvedAudioSource)
+                .setAudioFormat(resolvedSourceFormat)
+                .setChannelCount(resolvedChannelCount)
+                .setSampleRate(resolvedSampleRate)
+                .build();
+    }
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolver.java
deleted file mode 100644
index 8d6de0f..0000000
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/AudioSourceSettingsCamcorderProfileResolver.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.video.internal.config;
-
-import android.util.Range;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-import androidx.camera.video.AudioSpec;
-import androidx.camera.video.internal.AudioSource;
-import androidx.core.util.Supplier;
-
-/**
- * An {@link AudioSource.Settings} supplier that resolves requested source settings from an
- * {@link AudioSpec} using a {@link CamcorderProfileProxy}.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public final class AudioSourceSettingsCamcorderProfileResolver implements
-        Supplier<AudioSource.Settings> {
-
-    private static final String TAG = "AudioSrcCmcrdrPrflRslvr";
-
-    private final AudioSpec mAudioSpec;
-    private final CamcorderProfileProxy mCamcorderProfile;
-
-    /**
-     * Constructor for an AudioSourceSettingsCamcorderProfileResolver.
-     *
-     * @param camcorderProfile The {@link CamcorderProfileProxy} used to resolve automatic and
-     *                         range settings.
-     * @param audioSpec        The {@link AudioSpec} which defines the settings that should be
-     *                         used with the audio source.
-     */
-    public AudioSourceSettingsCamcorderProfileResolver(@NonNull AudioSpec audioSpec,
-            @NonNull CamcorderProfileProxy camcorderProfile) {
-        mAudioSpec = audioSpec;
-        mCamcorderProfile = camcorderProfile;
-    }
-
-    @Override
-    @NonNull
-    public AudioSource.Settings get() {
-        // Resolve audio source
-        int resolvedAudioSource = AudioConfigUtil.resolveAudioSource(mAudioSpec);
-
-        // Resolve source format
-        int resolvedSourceFormat = AudioConfigUtil.resolveAudioSourceFormat(
-                mAudioSpec);
-
-        int audioSpecChannelCount = mAudioSpec.getChannelCount();
-        Range<Integer> audioSpecSampleRate = mAudioSpec.getSampleRate();
-        int resolvedSampleRate;
-        int resolvedChannelCount;
-        int camcorderProfileChannelCount = mCamcorderProfile.getAudioChannels();
-        if (audioSpecChannelCount == AudioSpec.CHANNEL_COUNT_AUTO) {
-            resolvedChannelCount = camcorderProfileChannelCount;
-            Logger.d(TAG, "Resolved AUDIO channel count from CamcorderProfile: "
-                    + resolvedChannelCount);
-        } else {
-            resolvedChannelCount = audioSpecChannelCount;
-            Logger.d(TAG, "Media spec AUDIO channel count overrides CamcorderProfile "
-                    + "[CamcorderProfile channel count: " + camcorderProfileChannelCount
-                    + ", Resolved Channel Count: " + resolvedChannelCount + "]");
-        }
-
-        int camcorderProfileAudioSampleRate = mCamcorderProfile.getAudioSampleRate();
-        resolvedSampleRate = AudioConfigUtil.selectSampleRateOrNearestSupported(
-                audioSpecSampleRate, resolvedChannelCount, resolvedSourceFormat,
-                camcorderProfileAudioSampleRate);
-        Logger.d(TAG, "Using resolved AUDIO sample rate or nearest supported from "
-                + "CamcorderProfile: " + resolvedSampleRate + "Hz. [CamcorderProfile sample rate: "
-                + camcorderProfileAudioSampleRate + "Hz]");
-
-        return AudioSource.Settings.builder()
-                .setAudioSource(resolvedAudioSource)
-                .setAudioFormat(resolvedSourceFormat)
-                .setChannelCount(resolvedChannelCount)
-                .setSampleRate(resolvedSampleRate)
-                .build();
-    }
-}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/MimeInfo.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/MimeInfo.java
index 4fbbd71..983626b 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/MimeInfo.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/MimeInfo.java
@@ -19,7 +19,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.impl.CamcorderProfileProxy;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.encoder.EncoderConfig;
 
 import com.google.auto.value.AutoValue;
@@ -29,8 +29,9 @@
  *
  * <p>The information included in this class can include the mime type, profile and any
  * compatible configuration types that can be used to resolve settings, such as
- * {@link androidx.camera.core.impl.CamcorderProfileProxy}.
+ * {@link VideoValidatedEncoderProfilesProxy}.
  */
+@SuppressWarnings("NullableProblems") // Problem from AutoValue generated class.
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @AutoValue
 public abstract class MimeInfo {
@@ -49,12 +50,13 @@
     public abstract int getProfile();
 
     /**
-     * Returns compatible {@link CamcorderProfileProxy} that can be used to resolve settings.
+     * Returns compatible {@link VideoValidatedEncoderProfilesProxy} that can be used to resolve
+     * settings.
      *
-     * <p>If no camcorder profile is provided, returns {@code null}
+     * <p>If no EncoderProfiles is provided, returns {@code null}
      */
     @Nullable
-    public abstract CamcorderProfileProxy getCompatibleCamcorderProfile();
+    public abstract VideoValidatedEncoderProfilesProxy getCompatibleEncoderProfiles();
 
     /** Creates a builder for the given mime type */
     @NonNull
@@ -76,10 +78,10 @@
         @NonNull
         public abstract Builder setProfile(int profile);
 
-        /** Sets a compatible camcorder profile */
+        /** Sets a compatible EncoderProfiles */
         @NonNull
-        public abstract Builder setCompatibleCamcorderProfile(
-                @Nullable CamcorderProfileProxy camcorderProfile);
+        public abstract Builder setCompatibleEncoderProfiles(
+                @Nullable VideoValidatedEncoderProfilesProxy encoderProfiles);
 
         /** Builds the {@link androidx.camera.video.internal.config.MimeInfo}. */
         @NonNull
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoConfigUtil.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoConfigUtil.java
index 16416a7..8d3be191 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoConfigUtil.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoConfigUtil.java
@@ -24,10 +24,11 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
 import androidx.camera.core.impl.Timebase;
 import androidx.camera.video.MediaSpec;
 import androidx.camera.video.VideoSpec;
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy;
 import androidx.camera.video.internal.encoder.VideoEncoderConfig;
 import androidx.core.util.Supplier;
 
@@ -48,51 +49,51 @@
      * Resolves the video mime information into a {@link MimeInfo}.
      *
      * @param mediaSpec        the media spec to resolve the mime info.
-     * @param camcorderProfile the camcorder profile to resolve the mime info. It can be null if
-     *                         there is no relevant camcorder profile.
+     * @param encoderProfiles  the encoder profiles to resolve the mime info. It can be null if
+     *                         there is no relevant encoder profiles.
      * @return the video MimeInfo.
      */
     @NonNull
     public static MimeInfo resolveVideoMimeInfo(@NonNull MediaSpec mediaSpec,
-            @Nullable CamcorderProfileProxy camcorderProfile) {
+            @Nullable VideoValidatedEncoderProfilesProxy encoderProfiles) {
         String mediaSpecVideoMime = MediaSpec.outputFormatToVideoMime(mediaSpec.getOutputFormat());
         String resolvedVideoMime = mediaSpecVideoMime;
-        boolean camcorderProfileIsCompatible = false;
-        if (camcorderProfile != null) {
-            String camcorderProfileVideoMime = camcorderProfile.getVideoCodecMimeType();
-            // Use camcorder profile settings if the media spec's output format
-            // is set to auto or happens to match the CamcorderProfile's output format.
-            if (camcorderProfileVideoMime == null) {
-                Logger.d(TAG, "CamcorderProfile contains undefined VIDEO mime type so cannot be "
+        boolean encoderProfilesIsCompatible = false;
+        if (encoderProfiles != null) {
+            VideoProfileProxy videoProfile = encoderProfiles.getDefaultVideoProfile();
+            String encoderProfilesVideoMime = videoProfile.getMediaType();
+            // Use EncoderProfiles settings if the media spec's output format is set to auto or
+            // happens to match the EncoderProfiles' output format.
+            if (Objects.equals(encoderProfilesVideoMime, VideoProfileProxy.MEDIA_TYPE_NONE)) {
+                Logger.d(TAG, "EncoderProfiles contains undefined VIDEO mime type so cannot be "
                         + "used. May rely on fallback defaults to derive settings [chosen mime "
                         + "type: " + resolvedVideoMime + "]");
             } else if (mediaSpec.getOutputFormat() == MediaSpec.OUTPUT_FORMAT_AUTO) {
-                camcorderProfileIsCompatible = true;
-                resolvedVideoMime = camcorderProfileVideoMime;
-                Logger.d(TAG, "MediaSpec contains OUTPUT_FORMAT_AUTO. Using CamcorderProfile "
+                encoderProfilesIsCompatible = true;
+                resolvedVideoMime = encoderProfilesVideoMime;
+                Logger.d(TAG, "MediaSpec contains OUTPUT_FORMAT_AUTO. Using EncoderProfiles "
                         + "to derive VIDEO settings [mime type: " + resolvedVideoMime + "]");
-            } else if (Objects.equals(mediaSpecVideoMime, camcorderProfileVideoMime)) {
-                camcorderProfileIsCompatible = true;
-                resolvedVideoMime = camcorderProfileVideoMime;
-                Logger.d(TAG, "MediaSpec video mime matches CamcorderProfile. Using "
-                        + "CamcorderProfile to derive VIDEO settings [mime type: "
+            } else if (Objects.equals(mediaSpecVideoMime, encoderProfilesVideoMime)) {
+                encoderProfilesIsCompatible = true;
+                resolvedVideoMime = encoderProfilesVideoMime;
+                Logger.d(TAG, "MediaSpec video mime matches EncoderProfiles. Using "
+                        + "EncoderProfiles to derive VIDEO settings [mime type: "
                         + resolvedVideoMime + "]");
             } else {
-                Logger.d(TAG, "MediaSpec video mime does not match CamcorderProfile, so "
-                        + "CamcorderProfile settings cannot be used. May rely on fallback "
-                        + "defaults to derive VIDEO settings [CamcorderProfile mime type: "
-                        + camcorderProfileVideoMime + ", chosen mime type: "
+                Logger.d(TAG, "MediaSpec video mime does not match EncoderProfiles, so "
+                        + "EncoderProfiles settings cannot be used. May rely on fallback "
+                        + "defaults to derive VIDEO settings [EncoderProfiles mime type: "
+                        + encoderProfilesVideoMime + ", chosen mime type: "
                         + resolvedVideoMime + "]");
             }
         } else {
-            Logger.d(TAG,
-                    "No CamcorderProfile present. May rely on fallback defaults to derive VIDEO "
-                            + "settings [chosen mime type: " + resolvedVideoMime + "]");
+            Logger.d(TAG, "No EncoderProfiles present. May rely on fallback defaults to derive "
+                    + "VIDEO settings [chosen mime type: " + resolvedVideoMime + "]");
         }
 
         MimeInfo.Builder mimeInfoBuilder = MimeInfo.builder(resolvedVideoMime);
-        if (camcorderProfileIsCompatible) {
-            mimeInfoBuilder.setCompatibleCamcorderProfile(camcorderProfile);
+        if (encoderProfilesIsCompatible) {
+            mimeInfoBuilder.setCompatibleEncoderProfiles(encoderProfiles);
         }
 
         return mimeInfoBuilder.build();
@@ -113,11 +114,11 @@
             @NonNull Timebase inputTimebase, @NonNull VideoSpec videoSpec,
             @NonNull Size surfaceSize, @Nullable Range<Integer> expectedFrameRateRange) {
         Supplier<VideoEncoderConfig> configSupplier;
-        if (videoMimeInfo.getCompatibleCamcorderProfile() != null) {
-            configSupplier = new VideoEncoderConfigCamcorderProfileResolver(
+        VideoValidatedEncoderProfilesProxy profiles = videoMimeInfo.getCompatibleEncoderProfiles();
+        if (profiles != null) {
+            configSupplier = new VideoEncoderConfigVideoProfileResolver(
                     videoMimeInfo.getMimeType(), inputTimebase, videoSpec, surfaceSize,
-                    videoMimeInfo.getCompatibleCamcorderProfile(),
-                    expectedFrameRateRange);
+                    profiles.getDefaultVideoProfile(), expectedFrameRateRange);
         } else {
             configSupplier = new VideoEncoderConfigDefaultResolver(videoMimeInfo.getMimeType(),
                     inputTimebase, videoSpec, surfaceSize, expectedFrameRateRange);
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolver.java
deleted file mode 100644
index 5020129..0000000
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigCamcorderProfileResolver.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.video.internal.config;
-
-import android.util.Range;
-import android.util.Size;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.camera.core.Logger;
-import androidx.camera.core.impl.CamcorderProfileProxy;
-import androidx.camera.core.impl.Timebase;
-import androidx.camera.video.VideoSpec;
-import androidx.camera.video.internal.encoder.VideoEncoderConfig;
-import androidx.core.util.Supplier;
-
-/**
- * A {@link VideoEncoderConfig} supplier that resolves requested encoder settings from a
- * {@link VideoSpec} for the given surface {@link Size} using the provided
- * {@link CamcorderProfileProxy}.
- */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class VideoEncoderConfigCamcorderProfileResolver implements Supplier<VideoEncoderConfig> {
-
-    private static final String TAG = "VidEncCmcrdrPrflRslvr";
-
-    private final String mMimeType;
-    private final Timebase mInputTimebase;
-    private final VideoSpec mVideoSpec;
-    private final Size mSurfaceSize;
-    private final CamcorderProfileProxy mCamcorderProfile;
-    @Nullable
-    private final Range<Integer> mExpectedFrameRateRange;
-
-    /**
-     * Constructor for a VideoEncoderConfigCamcorderProfileResolver.
-     *
-     * @param mimeType         The mime type for the video encoder
-     * @param inputTimebase    The timebase of the input frame
-     * @param videoSpec        The {@link VideoSpec} which defines the settings that should be
-     *                         used with the video encoder.
-     * @param surfaceSize      The size of the surface required by the camera for the video encoder.
-     * @param camcorderProfile The {@link CamcorderProfileProxy} used to resolve automatic and
-     *                         range settings.
-     * @param expectedFrameRateRange The expected source frame rate range. This should act as an
-     *                               envelope for any frame rate calculated from {@code videoSpec
-     *                               } and {@code camcorderProfile} since the source should not
-     *                               produce frames at a frame rate outside this range. If {@code
-     *                               null}, then no information about the source frame rate is
-     *                               available and it does not need to be used in calculations.
-     */
-    public VideoEncoderConfigCamcorderProfileResolver(@NonNull String mimeType,
-            @NonNull Timebase inputTimebase,
-            @NonNull VideoSpec videoSpec,
-            @NonNull Size surfaceSize,
-            @NonNull CamcorderProfileProxy camcorderProfile,
-            @Nullable Range<Integer> expectedFrameRateRange) {
-        mMimeType = mimeType;
-        mInputTimebase = inputTimebase;
-        mVideoSpec = videoSpec;
-        mSurfaceSize = surfaceSize;
-        mCamcorderProfile = camcorderProfile;
-        mExpectedFrameRateRange = expectedFrameRateRange;
-    }
-
-    @Override
-    @NonNull
-    public VideoEncoderConfig get() {
-        int resolvedFrameRate = resolveFrameRate();
-        Logger.d(TAG, "Resolved VIDEO frame rate: " + resolvedFrameRate + "fps");
-
-        Range<Integer> videoSpecBitrateRange = mVideoSpec.getBitrate();
-        Logger.d(TAG, "Using resolved VIDEO bitrate from CamcorderProfile");
-        int resolvedBitrate = VideoConfigUtil.scaleAndClampBitrate(
-                mCamcorderProfile.getVideoBitRate(),
-                resolvedFrameRate, mCamcorderProfile.getVideoFrameRate(),
-                mSurfaceSize.getWidth(), mCamcorderProfile.getVideoFrameWidth(),
-                mSurfaceSize.getHeight(), mCamcorderProfile.getVideoFrameHeight(),
-                videoSpecBitrateRange);
-
-        return VideoEncoderConfig.builder()
-                .setMimeType(mMimeType)
-                .setInputTimebase(mInputTimebase)
-                .setResolution(mSurfaceSize)
-                .setBitrate(resolvedBitrate)
-                .setFrameRate(resolvedFrameRate)
-                .build();
-    }
-
-    private int resolveFrameRate() {
-        Range<Integer> videoSpecFrameRateRange = mVideoSpec.getFrameRate();
-        int camcorderProfileVideoFrameRate = mCamcorderProfile.getVideoFrameRate();
-        Logger.d(TAG,
-                String.format("Frame rate from camcorder profile: %dfps. [Requested range: %s, "
-                        + "Expected operating range: %s]", camcorderProfileVideoFrameRate,
-                        videoSpecFrameRateRange, mExpectedFrameRateRange));
-
-        return VideoConfigUtil.resolveFrameRate(
-                /*preferredRange=*/ videoSpecFrameRateRange,
-                /*exactFrameRateHint=*/ camcorderProfileVideoFrameRate,
-                /*strictOperatingFpsRange=*/mExpectedFrameRateRange);
-    }
-}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolver.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolver.java
new file mode 100644
index 0000000..0009f26
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/config/VideoEncoderConfigVideoProfileResolver.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.config;
+
+import android.util.Range;
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy;
+import androidx.camera.core.impl.Timebase;
+import androidx.camera.video.VideoSpec;
+import androidx.camera.video.internal.encoder.VideoEncoderConfig;
+import androidx.core.util.Supplier;
+
+/**
+ * A {@link VideoEncoderConfig} supplier that resolves requested encoder settings from a
+ * {@link VideoSpec} for the given surface {@link Size} using the provided
+ * {@link VideoProfileProxy}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class VideoEncoderConfigVideoProfileResolver implements Supplier<VideoEncoderConfig> {
+
+    private static final String TAG = "VidEncVdPrflRslvr";
+
+    private final String mMimeType;
+    private final Timebase mInputTimebase;
+    private final VideoSpec mVideoSpec;
+    private final Size mSurfaceSize;
+    private final VideoProfileProxy mVideoProfile;
+    @Nullable
+    private final Range<Integer> mExpectedFrameRateRange;
+
+    /**
+     * Constructor for a VideoEncoderConfigVideoProfileResolver.
+     *
+     * @param mimeType         The mime type for the video encoder
+     * @param inputTimebase    The timebase of the input frame
+     * @param videoSpec        The {@link VideoSpec} which defines the settings that should be
+     *                         used with the video encoder.
+     * @param surfaceSize      The size of the surface required by the camera for the video encoder.
+     * @param videoProfile     The {@link VideoProfileProxy} used to resolve automatic and range
+     *                         settings.
+     * @param expectedFrameRateRange The expected source frame rate range. This should act as an
+     *                               envelope for any frame rate calculated from {@code videoSpec
+     *                               } and {@code videoProfile} since the source should not
+     *                               produce frames at a frame rate outside this range. If {@code
+     *                               null}, then no information about the source frame rate is
+     *                               available and it does not need to be used in calculations.
+     */
+    public VideoEncoderConfigVideoProfileResolver(@NonNull String mimeType,
+            @NonNull Timebase inputTimebase,
+            @NonNull VideoSpec videoSpec,
+            @NonNull Size surfaceSize,
+            @NonNull VideoProfileProxy videoProfile,
+            @Nullable Range<Integer> expectedFrameRateRange) {
+        mMimeType = mimeType;
+        mInputTimebase = inputTimebase;
+        mVideoSpec = videoSpec;
+        mSurfaceSize = surfaceSize;
+        mVideoProfile = videoProfile;
+        mExpectedFrameRateRange = expectedFrameRateRange;
+    }
+
+    @Override
+    @NonNull
+    public VideoEncoderConfig get() {
+        int resolvedFrameRate = resolveFrameRate();
+        Logger.d(TAG, "Resolved VIDEO frame rate: " + resolvedFrameRate + "fps");
+
+        Range<Integer> videoSpecBitrateRange = mVideoSpec.getBitrate();
+        Logger.d(TAG, "Using resolved VIDEO bitrate from EncoderProfiles");
+        int resolvedBitrate = VideoConfigUtil.scaleAndClampBitrate(
+                mVideoProfile.getBitrate(),
+                resolvedFrameRate, mVideoProfile.getFrameRate(),
+                mSurfaceSize.getWidth(), mVideoProfile.getWidth(),
+                mSurfaceSize.getHeight(), mVideoProfile.getHeight(),
+                videoSpecBitrateRange);
+
+        return VideoEncoderConfig.builder()
+                .setMimeType(mMimeType)
+                .setInputTimebase(mInputTimebase)
+                .setResolution(mSurfaceSize)
+                .setBitrate(resolvedBitrate)
+                .setFrameRate(resolvedFrameRate)
+                .build();
+    }
+
+    private int resolveFrameRate() {
+        Range<Integer> videoSpecFrameRateRange = mVideoSpec.getFrameRate();
+        int videoProfileFrameRate = mVideoProfile.getFrameRate();
+        Logger.d(TAG,
+                String.format("Frame rate from video profile: %dfps. [Requested range: %s, "
+                        + "Expected operating range: %s]", videoProfileFrameRate,
+                        videoSpecFrameRateRange, mExpectedFrameRateRange));
+
+        return VideoConfigUtil.resolveFrameRate(
+                /*preferredRange=*/ videoSpecFrameRateRange,
+                /*exactFrameRateHint=*/ videoProfileFrameRate,
+                /*strictOperatingFpsRange=*/mExpectedFrameRateRange);
+    }
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
index b3596b2..7d2f985 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.impl.CamcorderProfileProxy;
+import androidx.camera.core.impl.EncoderProfilesProxy;
 import androidx.camera.core.impl.Timebase;
 
 /**
@@ -32,7 +32,7 @@
 public interface EncoderConfig {
 
     /** Constant corresponding to no profile for the encoder */
-    int CODEC_PROFILE_NONE = CamcorderProfileProxy.CODEC_PROFILE_NONE;
+    int CODEC_PROFILE_NONE = EncoderProfilesProxy.CODEC_PROFILE_NONE;
 
     /**
      * The mime type of the encoder.
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/QualitySelectorTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/QualitySelectorTest.kt
index 8e7dd14..664c481 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/QualitySelectorTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/QualitySelectorTest.kt
@@ -16,16 +16,21 @@
 
 package androidx.camera.video
 
+import android.media.CamcorderProfile.QUALITY_1080P
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_480P
+import android.media.CamcorderProfile.QUALITY_720P
+import android.media.CamcorderProfile.QUALITY_HIGH
+import android.media.CamcorderProfile.QUALITY_LOW
 import android.os.Build
-import androidx.camera.testing.CamcorderProfileUtil
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_1080P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_2160P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_480P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_720P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_2160P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_720P
-import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_2160P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_720P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_1080P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_2160P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_480P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_720P
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertThrows
 import org.junit.Test
@@ -36,10 +41,6 @@
 
 private const val CAMERA_ID_0 = "0"
 private const val CAMERA_ID_1 = "1"
-private val CAMERA_0_PROFILE_HIGH = CamcorderProfileUtil.asHighQuality(PROFILE_2160P)
-private val CAMERA_0_PROFILE_LOW = CamcorderProfileUtil.asLowQuality(PROFILE_720P)
-private val CAMERA_1_PROFILE_HIGH = CamcorderProfileUtil.asHighQuality(PROFILE_1080P)
-private val CAMERA_1_PROFILE_LOW = CamcorderProfileUtil.asLowQuality(PROFILE_480P)
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
@@ -47,22 +48,20 @@
 class QualitySelectorTest {
 
     private val cameraInfo0 = FakeCameraInfoInternal(CAMERA_ID_0).apply {
-        camcorderProfileProvider = FakeCamcorderProfileProvider.Builder()
-            .addProfile(
-                CAMERA_0_PROFILE_HIGH,
-                PROFILE_2160P,
-                PROFILE_720P,
-                CAMERA_0_PROFILE_LOW
-            ).build()
+        encoderProfilesProvider = FakeEncoderProfilesProvider.Builder()
+            .add(QUALITY_HIGH, PROFILES_2160P)
+            .add(QUALITY_2160P, PROFILES_2160P)
+            .add(QUALITY_720P, PROFILES_720P)
+            .add(QUALITY_LOW, PROFILES_720P)
+            .build()
     }
     private val cameraInfo1 = FakeCameraInfoInternal(CAMERA_ID_1).apply {
-        camcorderProfileProvider = FakeCamcorderProfileProvider.Builder()
-            .addProfile(
-                CAMERA_1_PROFILE_HIGH,
-                PROFILE_1080P,
-                PROFILE_480P,
-                CAMERA_1_PROFILE_LOW
-            ).build()
+        encoderProfilesProvider = FakeEncoderProfilesProvider.Builder()
+            .add(QUALITY_HIGH, PROFILES_1080P)
+            .add(QUALITY_1080P, PROFILES_1080P)
+            .add(QUALITY_480P, PROFILES_480P)
+            .add(QUALITY_LOW, PROFILES_480P)
+            .build()
     }
 
     @Test
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoCapabilitiesTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoCapabilitiesTest.kt
index b77ffb6..8accf99 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoCapabilitiesTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoCapabilitiesTest.kt
@@ -16,13 +16,18 @@
 
 package androidx.camera.video
 
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_720P
+import android.media.CamcorderProfile.QUALITY_HIGH
+import android.media.CamcorderProfile.QUALITY_LOW
 import android.os.Build
 import android.util.Size
-import androidx.camera.testing.CamcorderProfileUtil
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_2160P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_720P
-import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
+import androidx.camera.testing.EncoderProfilesUtil
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_2160P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_720P
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
+import androidx.camera.video.internal.VideoValidatedEncoderProfilesProxy
 import androidx.core.util.component1
 import androidx.core.util.component2
 import com.google.common.truth.Truth.assertThat
@@ -32,22 +37,21 @@
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 
-private val PROFILE_HIGH = CamcorderProfileUtil.asHighQuality(PROFILE_2160P)
-private val PROFILE_LOW = CamcorderProfileUtil.asLowQuality(PROFILE_720P)
-
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class VideoCapabilitiesTest {
 
     private val cameraInfo = FakeCameraInfoInternal().apply {
-        camcorderProfileProvider = FakeCamcorderProfileProvider.Builder()
-            .addProfile(PROFILE_HIGH) // UHD (2160p) per above definition
-            .addProfile(PROFILE_2160P) // UHD (2160p)
-            .addProfile(PROFILE_720P) // HD (720p)
-            .addProfile(PROFILE_LOW) // HD (720p) per above definition
+        encoderProfilesProvider = FakeEncoderProfilesProvider.Builder()
+            .add(QUALITY_HIGH, PROFILES_2160P) // UHD (2160p) per above definition
+            .add(QUALITY_2160P, PROFILES_2160P) // UHD (2160p)
+            .add(QUALITY_720P, PROFILES_720P) // HD (720p)
+            .add(QUALITY_LOW, PROFILES_720P) // HD (720p) per above definition
             .build()
     }
+    private val validatedProfiles2160p = VideoValidatedEncoderProfilesProxy.from(PROFILES_2160P)
+    private val validatedProfiles720p = VideoValidatedEncoderProfilesProxy.from(PROFILES_720P)
 
     @Test
     fun isQualitySupported() {
@@ -63,23 +67,19 @@
     @Test
     fun getProfile() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
-        assertThat(videoCapabilities.getProfile(Quality.HIGHEST))
-            .isEqualTo(PROFILE_2160P)
-        assertThat(videoCapabilities.getProfile(Quality.LOWEST))
-            .isEqualTo(PROFILE_720P)
-        assertThat(videoCapabilities.getProfile(Quality.UHD))
-            .isEqualTo(PROFILE_2160P)
-        assertThat(videoCapabilities.getProfile(Quality.FHD)).isNull()
-        assertThat(videoCapabilities.getProfile(Quality.HD))
-            .isEqualTo(PROFILE_720P)
-        assertThat(videoCapabilities.getProfile(Quality.SD)).isNull()
+        assertThat(videoCapabilities.getProfiles(Quality.HIGHEST)).isEqualTo(validatedProfiles2160p)
+        assertThat(videoCapabilities.getProfiles(Quality.LOWEST)).isEqualTo(validatedProfiles720p)
+        assertThat(videoCapabilities.getProfiles(Quality.UHD)).isEqualTo(validatedProfiles2160p)
+        assertThat(videoCapabilities.getProfiles(Quality.FHD)).isNull()
+        assertThat(videoCapabilities.getProfiles(Quality.HD)).isEqualTo(validatedProfiles720p)
+        assertThat(videoCapabilities.getProfiles(Quality.SD)).isNull()
     }
 
     @Test
     fun findHighestSupportedQuality_returnsHigherQuality() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size between 720p and 2160p
-        val (width720p, height720p) = CamcorderProfileUtil.RESOLUTION_720P
+        val (width720p, height720p) = EncoderProfilesUtil.RESOLUTION_720P
         val inBetweenSize = Size(width720p + 10, height720p)
 
         assertThat(videoCapabilities.findHighestSupportedQualityFor(inBetweenSize))
@@ -90,7 +90,7 @@
     fun findHighestSupportedQuality_returnsHighestQuality_whenAboveHighest() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size between greater than the max quality (UHD)
-        val (width2160p, height2160p) = CamcorderProfileUtil.RESOLUTION_2160P
+        val (width2160p, height2160p) = EncoderProfilesUtil.RESOLUTION_2160P
         val aboveHighestSize = Size(width2160p + 10, height2160p)
 
         assertThat(videoCapabilities.findHighestSupportedQualityFor(aboveHighestSize))
@@ -101,7 +101,7 @@
     fun findHighestSupportedQuality_returnsLowestQuality_whenBelowLowest() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size below the lowest quality (HD)
-        val (width720p, height720p) = CamcorderProfileUtil.RESOLUTION_720P
+        val (width720p, height720p) = EncoderProfilesUtil.RESOLUTION_720P
         val belowLowestSize = Size(width720p - 10, height720p)
 
         assertThat(videoCapabilities.findHighestSupportedQualityFor(belowLowestSize))
@@ -111,51 +111,51 @@
     @Test
     fun findHighestSupportedQuality_returnsExactQuality_whenExactSizeGiven() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
-        val exactSize720p = CamcorderProfileUtil.RESOLUTION_720P
+        val exactSize720p = EncoderProfilesUtil.RESOLUTION_720P
 
         assertThat(videoCapabilities.findHighestSupportedQualityFor(exactSize720p))
             .isEqualTo(Quality.HD)
     }
 
     @Test
-    fun findHighestSupportedCamcorderProfileFor_returnsHigherProfile() {
+    fun findHighestSupportedEncoderProfilesFor_returnsHigherProfile() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size between 720p and 2160p
-        val (width720p, height720p) = CamcorderProfileUtil.RESOLUTION_720P
+        val (width720p, height720p) = EncoderProfilesUtil.RESOLUTION_720P
         val inBetweenSize = Size(width720p + 10, height720p)
 
-        assertThat(videoCapabilities.findHighestSupportedCamcorderProfileFor(inBetweenSize))
-            .isEqualTo(PROFILE_2160P)
+        assertThat(videoCapabilities.findHighestSupportedEncoderProfilesFor(inBetweenSize))
+            .isEqualTo(validatedProfiles2160p)
     }
 
     @Test
-    fun findHighestSupportedCamcorderProfileFor_returnsHighestProfile_whenAboveHighest() {
+    fun findHighestSupportedEncoderProfilesFor_returnsHighestProfile_whenAboveHighest() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size between greater than the max quality (UHD)
-        val (width2160p, height2160p) = CamcorderProfileUtil.RESOLUTION_2160P
+        val (width2160p, height2160p) = EncoderProfilesUtil.RESOLUTION_2160P
         val aboveHighestSize = Size(width2160p + 10, height2160p)
 
-        assertThat(videoCapabilities.findHighestSupportedCamcorderProfileFor(aboveHighestSize))
-            .isEqualTo(PROFILE_2160P)
+        assertThat(videoCapabilities.findHighestSupportedEncoderProfilesFor(aboveHighestSize))
+            .isEqualTo(validatedProfiles2160p)
     }
 
     @Test
-    fun findHighestSupportedCamcorderProfileFor_returnsLowestProfile_whenBelowLowest() {
+    fun findHighestSupportedEncoderProfilesFor_returnsLowestProfile_whenBelowLowest() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
         // Create a size below the lowest quality (HD)
-        val (width720p, height720p) = CamcorderProfileUtil.RESOLUTION_720P
+        val (width720p, height720p) = EncoderProfilesUtil.RESOLUTION_720P
         val belowLowestSize = Size(width720p - 10, height720p)
 
-        assertThat(videoCapabilities.findHighestSupportedCamcorderProfileFor(belowLowestSize))
-            .isEqualTo(PROFILE_720P)
+        assertThat(videoCapabilities.findHighestSupportedEncoderProfilesFor(belowLowestSize))
+            .isEqualTo(validatedProfiles720p)
     }
 
     @Test
-    fun findHighestSupportedCamcorderProfileFor_returnsExactProfile_whenExactSizeGiven() {
+    fun findHighestSupportedEncoderProfilesFor_returnsExactProfile_whenExactSizeGiven() {
         val videoCapabilities = VideoCapabilities.from(cameraInfo)
-        val exactSize720p = CamcorderProfileUtil.RESOLUTION_720P
+        val exactSize720p = EncoderProfilesUtil.RESOLUTION_720P
 
-        assertThat(videoCapabilities.findHighestSupportedCamcorderProfileFor(exactSize720p))
-            .isEqualTo(PROFILE_720P)
+        assertThat(videoCapabilities.findHighestSupportedEncoderProfilesFor(exactSize720p))
+            .isEqualTo(validatedProfiles720p)
     }
 }
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
index dd46cef..d94802f 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
@@ -18,6 +18,12 @@
 
 import android.content.Context
 import android.graphics.Rect
+import android.media.CamcorderProfile.QUALITY_1080P
+import android.media.CamcorderProfile.QUALITY_2160P
+import android.media.CamcorderProfile.QUALITY_480P
+import android.media.CamcorderProfile.QUALITY_720P
+import android.media.CamcorderProfile.QUALITY_HIGH
+import android.media.CamcorderProfile.QUALITY_LOW
 import android.os.Build
 import android.os.Looper
 import android.util.Range
@@ -26,15 +32,16 @@
 import androidx.arch.core.util.Function
 import androidx.camera.core.AspectRatio.RATIO_16_9
 import androidx.camera.core.AspectRatio.RATIO_4_3
+import androidx.camera.core.CameraEffect
 import androidx.camera.core.CameraEffect.VIDEO_CAPTURE
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraSelector.LENS_FACING_BACK
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.UseCase
-import androidx.camera.core.impl.CamcorderProfileProxy
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.CameraInfoInternal
+import androidx.camera.core.impl.EncoderProfilesProxy
 import androidx.camera.core.impl.ImageFormatConstants
 import androidx.camera.core.impl.ImageOutputConfig
 import androidx.camera.core.impl.MutableStateObservable
@@ -47,27 +54,26 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.directExecutor
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.core.processing.SurfaceProcessorInternal
-import androidx.camera.testing.CamcorderProfileUtil
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_1080P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_2160P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_480P
-import androidx.camera.testing.CamcorderProfileUtil.PROFILE_720P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_1080P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_2160P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_480P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_720P
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_QHD
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_QVGA
-import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_VGA
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_1080P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_2160P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_480P
+import androidx.camera.testing.EncoderProfilesUtil.PROFILES_720P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_1080P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_2160P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_480P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_720P
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_QHD
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_QVGA
+import androidx.camera.testing.EncoderProfilesUtil.RESOLUTION_VGA
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
-import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import androidx.camera.testing.fakes.FakeEncoderProfilesProvider
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.video.Quality.FHD
 import androidx.camera.video.Quality.HD
@@ -100,11 +106,11 @@
 
 private val ANY_SIZE = Size(640, 480)
 private const val CAMERA_ID_0 = "0"
-private val CAMERA_0_PROFILES = arrayOf(
-    CamcorderProfileUtil.asHighQuality(PROFILE_2160P),
-    PROFILE_2160P,
-    PROFILE_720P,
-    CamcorderProfileUtil.asLowQuality(PROFILE_720P)
+private val CAMERA_0_PROFILES = mapOf(
+    QUALITY_HIGH to PROFILES_2160P,
+    QUALITY_2160P to PROFILES_2160P,
+    QUALITY_720P to PROFILES_720P,
+    QUALITY_LOW to PROFILES_720P,
 )
 
 @RunWith(RobolectricTestRunner::class)
@@ -145,8 +151,7 @@
     fun setNoCameraTransform_propagatesToCameraEdge() {
         // Arrange.
         setupCamera()
-        val processor = createFakeSurfaceProcessor()
-        val videoCapture = createVideoCapture(createVideoOutput(), processor = processor)
+        val videoCapture = createVideoCapture(createVideoOutput(), effect = createFakeEffect())
         // Act: set no transform and create pipeline.
         videoCapture.hasCameraTransform = false
         videoCapture.bindToCamera(camera, null, null)
@@ -163,8 +168,7 @@
         // Arrange.
         setupCamera()
         createCameraUseCaseAdapter()
-        val processor = createFakeSurfaceProcessor()
-        val videoCapture = createVideoCapture(createVideoOutput(), processor = processor)
+        val videoCapture = createVideoCapture(createVideoOutput(), effect = createFakeEffect())
         // Act.
         addAndAttachUseCases(videoCapture)
         // Assert.
@@ -199,7 +203,7 @@
     fun enableProcessor_sensorRotationIs0AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 0,
-            processor = createFakeSurfaceProcessor()
+            effect = createFakeEffect()
         )
     }
 
@@ -207,7 +211,7 @@
     fun enableProcessor_sensorRotationIs90AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 90,
-            processor = createFakeSurfaceProcessor()
+            effect = createFakeEffect()
         )
     }
 
@@ -215,7 +219,7 @@
     fun enableProcessor_sensorRotationIs180AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 180,
-            processor = createFakeSurfaceProcessor()
+            effect = createFakeEffect()
         )
     }
 
@@ -223,7 +227,7 @@
     fun enableProcessor_sensorRotationIs270AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 270,
-            processor = createFakeSurfaceProcessor()
+            effect = createFakeEffect()
         )
     }
 
@@ -233,7 +237,7 @@
         setupCamera()
         createCameraUseCaseAdapter()
         val videoCapture =
-            createVideoCapture(createVideoOutput(), processor = createFakeSurfaceProcessor())
+            createVideoCapture(createVideoOutput(), effect = createFakeEffect())
         addAndAttachUseCases(videoCapture)
         // Act: invalidate.
         videoCapture.surfaceRequest.invalidate()
@@ -247,8 +251,9 @@
         // Arrange: create videoCapture.
         setupCamera()
         createCameraUseCaseAdapter()
-        val processor = createFakeSurfaceProcessor()
-        val videoCapture = createVideoCapture(createVideoOutput(), processor = processor)
+        val processor = FakeSurfaceProcessorInternal(mainThreadExecutor())
+        val effect = createFakeEffect(processor = processor)
+        val videoCapture = createVideoCapture(createVideoOutput(), effect = effect)
         addAndAttachUseCases(videoCapture)
         // Act: invalidate.
         processor.surfaceRequest!!.invalidate()
@@ -277,7 +282,7 @@
         setupCamera()
         createCameraUseCaseAdapter()
         val videoCapture =
-            createVideoCapture(createVideoOutput(), processor = createFakeSurfaceProcessor())
+            createVideoCapture(createVideoOutput(), effect = createFakeEffect())
         addAndAttachUseCases(videoCapture)
         val surfaceRequest = videoCapture.surfaceRequest
         detachAndRemoveUseCases(videoCapture)
@@ -291,7 +296,7 @@
 
     private fun testSetRotationWillSendCorrectResolution(
         sensorRotation: Int = 0,
-        processor: SurfaceProcessorInternal? = null
+        effect: CameraEffect? = null
     ) {
         setupCamera(sensorRotation = sensorRotation)
         createCameraUseCaseAdapter()
@@ -313,7 +318,7 @@
                 surfaceRequestListener = { request, _ ->
                     surfaceRequest = request
                 })
-            val videoCapture = createVideoCapture(videoOutput, processor = processor)
+            val videoCapture = createVideoCapture(videoOutput, effect = effect)
             videoCapture.targetRotation = targetRotation
 
             // Act.
@@ -321,7 +326,7 @@
 
             // Assert.
             val resolution = CAMERA_0_QUALITY_SIZE[quality]!!
-            val expectedResolution = if (processor != null) {
+            val expectedResolution = if (effect != null) {
                 rotateSize(resolution, cameraInfo.getSensorRotationDegrees(targetRotation))
             } else {
                 resolution
@@ -347,7 +352,7 @@
     @Test
     fun addUseCasesWithSurfaceProcessor_cameraIsUptime_requestIsUptime() {
         testTimebase(
-            processor = createFakeSurfaceProcessor(),
+            effect = createFakeEffect(),
             cameraTimebase = Timebase.UPTIME,
             expectedTimebase = Timebase.UPTIME
         )
@@ -356,14 +361,14 @@
     @Test
     fun addUseCasesWithSurfaceProcessor_cameraIsRealtime_requestIsRealtime() {
         testTimebase(
-            processor = createFakeSurfaceProcessor(),
+            effect = createFakeEffect(),
             cameraTimebase = Timebase.REALTIME,
             expectedTimebase = Timebase.REALTIME
         )
     }
 
     private fun testTimebase(
-        processor: SurfaceProcessorInternal? = null,
+        effect: CameraEffect? = null,
         cameraTimebase: Timebase,
         expectedTimebase: Timebase
     ) {
@@ -375,7 +380,7 @@
         val videoOutput = createVideoOutput(surfaceRequestListener = { _, tb ->
             timebase = tb
         })
-        val videoCapture = createVideoCapture(videoOutput, processor = processor)
+        val videoCapture = createVideoCapture(videoOutput, effect = effect)
 
         // Act.
         addAndAttachUseCases(videoCapture)
@@ -433,13 +438,13 @@
     fun setQualitySelector_sameCustomOrderedResolutions() {
         // Arrange.
         setupCamera(
-            profiles = arrayOf(
-                CamcorderProfileUtil.asHighQuality(PROFILE_2160P),
-                PROFILE_2160P,
-                PROFILE_1080P,
-                PROFILE_720P,
-                PROFILE_480P,
-                CamcorderProfileUtil.asLowQuality(PROFILE_480P)
+            profiles = mapOf(
+                QUALITY_HIGH to PROFILES_2160P,
+                QUALITY_2160P to PROFILES_2160P,
+                QUALITY_1080P to PROFILES_1080P,
+                QUALITY_720P to PROFILES_720P,
+                QUALITY_480P to PROFILES_480P,
+                QUALITY_LOW to PROFILES_480P
             )
         )
         createCameraUseCaseAdapter()
@@ -475,13 +480,13 @@
     fun setAspectRatio_4by3() {
         // Arrange.
         setupCamera(
-            profiles = arrayOf(
-                CamcorderProfileUtil.asHighQuality(PROFILE_2160P),
-                PROFILE_2160P,
-                PROFILE_1080P,
-                PROFILE_720P,
-                PROFILE_480P,
-                CamcorderProfileUtil.asLowQuality(PROFILE_480P)
+            profiles = mapOf(
+                QUALITY_HIGH to PROFILES_2160P,
+                QUALITY_2160P to PROFILES_2160P,
+                QUALITY_1080P to PROFILES_1080P,
+                QUALITY_720P to PROFILES_720P,
+                QUALITY_480P to PROFILES_480P,
+                QUALITY_LOW to PROFILES_480P
             )
         )
         createCameraUseCaseAdapter()
@@ -515,13 +520,13 @@
     fun setAspectRatio_16by9() {
         // Arrange.
         setupCamera(
-            profiles = arrayOf(
-                CamcorderProfileUtil.asHighQuality(PROFILE_2160P),
-                PROFILE_2160P,
-                PROFILE_1080P,
-                PROFILE_720P,
-                PROFILE_480P,
-                CamcorderProfileUtil.asLowQuality(PROFILE_480P)
+            profiles = mapOf(
+                QUALITY_HIGH to PROFILES_2160P,
+                QUALITY_2160P to PROFILES_2160P,
+                QUALITY_1080P to PROFILES_1080P,
+                QUALITY_720P to PROFILES_720P,
+                QUALITY_480P to PROFILES_480P,
+                QUALITY_LOW to PROFILES_480P
             )
         )
         createCameraUseCaseAdapter()
@@ -561,7 +566,7 @@
         val videoOutput = createVideoOutput()
         val videoCapture = createVideoCapture(
             videoOutput,
-            processor = createFakeSurfaceProcessor(),
+            effect = createFakeEffect(),
             videoEncoderInfoFinder = {
                 createVideoEncoderInfo(widthAlignment = 16, heightAlignment = 16)
             })
@@ -597,7 +602,7 @@
     @Test
     fun noSupportedQuality_supportedResolutionsIsNotSet() {
         // Arrange.
-        setupCamera(profiles = emptyArray())
+        setupCamera(profiles = emptyMap())
         createCameraUseCaseAdapter()
 
         val videoOutput = createVideoOutput(
@@ -764,7 +769,8 @@
                 appSurfaceReadyToRelease = true
             }
         })
-        val videoCapture = createVideoCapture(videoOutput, processor = processor)
+        val effect = createFakeEffect(processor = processor)
+        val videoCapture = createVideoCapture(videoOutput, effect = effect)
 
         // Act: bind and provide Surface.
         addAndAttachUseCases(videoCapture)
@@ -898,7 +904,7 @@
         )
         val videoCapture = createVideoCapture(
             videoOutput,
-            processor = createFakeSurfaceProcessor(),
+            effect = createFakeEffect(),
             videoEncoderInfoFinder = { videoEncoderInfo }
         )
         videoCapture.setViewPortCropRect(cropRect)
@@ -997,7 +1003,7 @@
         hasCameraTransform: Boolean = true,
         targetRotation: Int? = null,
         targetResolution: Size? = null,
-        processor: SurfaceProcessorInternal? = null,
+        effect: CameraEffect? = null,
         videoEncoderInfoFinder: Function<VideoEncoderConfig, VideoEncoderInfo> =
             Function { createVideoEncoderInfo() },
     ): VideoCapture<VideoOutput> = VideoCapture.Builder(videoOutput)
@@ -1007,11 +1013,18 @@
             targetResolution?.let { setTargetResolution(it) }
             setVideoEncoderInfoFinder(videoEncoderInfoFinder)
         }.build().apply {
-            setProcessor(processor)
+            setEffect(effect)
             setHasCameraTransform(hasCameraTransform)
         }
 
-    private fun createFakeSurfaceProcessor() = FakeSurfaceProcessorInternal(mainThreadExecutor())
+    private fun createFakeEffect(
+        processor: FakeSurfaceProcessorInternal = FakeSurfaceProcessorInternal(
+            mainThreadExecutor()
+        )
+    ) =
+        FakeSurfaceEffect(
+            processor
+        )
 
     private fun setSuggestedStreamSpec(quality: Quality) {
         setSuggestedStreamSpec(StreamSpec.builder(CAMERA_0_QUALITY_SIZE[quality]!!).build())
@@ -1029,15 +1042,14 @@
         cameraId: String = CAMERA_ID_0,
         sensorRotation: Int = 0,
         supportedResolutions: Map<Int, List<Size>> = CAMERA_0_SUPPORTED_RESOLUTION_MAP,
-        vararg profiles: CamcorderProfileProxy = CAMERA_0_PROFILES,
+        profiles: Map<Int, EncoderProfilesProxy> = CAMERA_0_PROFILES,
         timebase: Timebase = Timebase.UPTIME,
     ) {
         cameraInfo = FakeCameraInfoInternal(cameraId, sensorRotation, LENS_FACING_BACK).apply {
             supportedResolutions.forEach { (format, resolutions) ->
                 setSupportedResolutions(format, resolutions)
             }
-            camcorderProfileProvider =
-                FakeCamcorderProfileProvider.Builder().addProfile(*profiles).build()
+            encoderProfilesProvider = FakeEncoderProfilesProvider.Builder().addAll(profiles).build()
             setTimebase(timebase)
         }
         camera = FakeCamera(cameraId, null, cameraInfo)
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxyTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxyTest.kt
new file mode 100644
index 0000000..b853ba7
--- /dev/null
+++ b/camera/camera-video/src/test/java/androidx/camera/video/internal/VideoValidatedEncoderProfilesProxyTest.kt
@@ -0,0 +1,116 @@
+/*
+ * 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.video.internal
+
+import android.os.Build
+import androidx.camera.core.impl.EncoderProfilesProxy.VideoProfileProxy
+import androidx.camera.testing.EncoderProfilesUtil
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+private const val DEFAULT_WIDTH = 1920
+private const val DEFAULT_HEIGHT = 1080
+private val DEFAULT_VIDEO_PROFILE = VideoProfileProxy.create(
+    EncoderProfilesUtil.DEFAULT_VIDEO_CODEC,
+    EncoderProfilesUtil.DEFAULT_VIDEO_MEDIA_TYPE,
+    EncoderProfilesUtil.DEFAULT_VIDEO_BITRATE,
+    EncoderProfilesUtil.DEFAULT_VIDEO_FRAME_RATE,
+    DEFAULT_WIDTH,
+    DEFAULT_HEIGHT,
+    EncoderProfilesUtil.DEFAULT_VIDEO_PROFILE,
+    EncoderProfilesUtil.DEFAULT_VIDEO_BIT_DEPTH,
+    EncoderProfilesUtil.DEFAULT_VIDEO_CHROMA_SUBSAMPLING,
+    EncoderProfilesUtil.DEFAULT_VIDEO_HDR_FORMAT
+)
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class VideoValidatedEncoderProfilesProxyTest {
+
+    @Test
+    fun createFromEncoderProfilesProxy() {
+        val profiles = EncoderProfilesUtil.PROFILES_1080P
+        val validatedProfiles = VideoValidatedEncoderProfilesProxy.from(profiles)
+
+        assertThat(validatedProfiles.recommendedFileFormat)
+            .isEqualTo(profiles.recommendedFileFormat)
+        assertThat(validatedProfiles.defaultDurationSeconds)
+            .isEqualTo(profiles.defaultDurationSeconds)
+        assertThat(validatedProfiles.audioProfiles.size).isEqualTo(profiles.audioProfiles.size)
+        assertThat(validatedProfiles.videoProfiles.size).isEqualTo(profiles.videoProfiles.size)
+        assertThat(validatedProfiles.defaultAudioProfile).isNotNull()
+        assertThat(validatedProfiles.defaultVideoProfile).isNotNull()
+        assertThat(validatedProfiles.audioProfiles[0].codec)
+            .isEqualTo(profiles.audioProfiles[0].codec)
+        assertThat(validatedProfiles.audioProfiles[0].mediaType)
+            .isEqualTo(profiles.audioProfiles[0].mediaType)
+        assertThat(validatedProfiles.audioProfiles[0].bitrate)
+            .isEqualTo(profiles.audioProfiles[0].bitrate)
+        assertThat(validatedProfiles.audioProfiles[0].sampleRate)
+            .isEqualTo(profiles.audioProfiles[0].sampleRate)
+        assertThat(validatedProfiles.audioProfiles[0].channels)
+            .isEqualTo(profiles.audioProfiles[0].channels)
+        assertThat(validatedProfiles.audioProfiles[0].profile)
+            .isEqualTo(profiles.audioProfiles[0].profile)
+        assertThat(validatedProfiles.videoProfiles[0].codec)
+            .isEqualTo(profiles.videoProfiles[0].codec)
+        assertThat(validatedProfiles.videoProfiles[0].mediaType)
+            .isEqualTo(profiles.videoProfiles[0].mediaType)
+        assertThat(validatedProfiles.videoProfiles[0].bitrate)
+            .isEqualTo(profiles.videoProfiles[0].bitrate)
+        assertThat(validatedProfiles.videoProfiles[0].frameRate)
+            .isEqualTo(profiles.videoProfiles[0].frameRate)
+        assertThat(validatedProfiles.videoProfiles[0].width)
+            .isEqualTo(profiles.videoProfiles[0].width)
+        assertThat(validatedProfiles.videoProfiles[0].height)
+            .isEqualTo(profiles.videoProfiles[0].height)
+        assertThat(validatedProfiles.videoProfiles[0].profile)
+            .isEqualTo(profiles.videoProfiles[0].profile)
+        assertThat(validatedProfiles.videoProfiles[0].bitDepth)
+            .isEqualTo(profiles.videoProfiles[0].bitDepth)
+        assertThat(validatedProfiles.videoProfiles[0].chromaSubsampling)
+            .isEqualTo(profiles.videoProfiles[0].chromaSubsampling)
+        assertThat(validatedProfiles.videoProfiles[0].hdrFormat)
+            .isEqualTo(profiles.videoProfiles[0].hdrFormat)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun create_throwsException_whenVideoProfilesIsEmpty() {
+        VideoValidatedEncoderProfilesProxy.create(
+            EncoderProfilesUtil.DEFAULT_DURATION,
+            EncoderProfilesUtil.DEFAULT_OUTPUT_FORMAT,
+            emptyList(),
+            emptyList()
+        )
+    }
+
+    @Test
+    fun create_withEmptyAudioProfiles() {
+        val validatedProfiles = VideoValidatedEncoderProfilesProxy.create(
+            EncoderProfilesUtil.DEFAULT_DURATION,
+            EncoderProfilesUtil.DEFAULT_OUTPUT_FORMAT,
+            emptyList(),
+            listOf(DEFAULT_VIDEO_PROFILE)
+        )
+        assertThat(validatedProfiles.defaultAudioProfile).isNull()
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
index 9476da71e..e6266ed 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
@@ -35,7 +35,7 @@
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.fakes.FakeActivity
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakePreviewEffect
+import androidx.camera.testing.fakes.FakeSurfaceEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
@@ -126,11 +126,11 @@
         waitUtilPreviewViewIsReady(previewView!!)
 
         // Act: set the same effect twice, which is invalid.
-        val previewEffect1 = FakePreviewEffect(
+        val previewEffect1 = FakeSurfaceEffect(
             mainThreadExecutor(),
             FakeSurfaceProcessor(mainThreadExecutor())
         )
-        val previewEffect2 = FakePreviewEffect(
+        val previewEffect2 = FakeSurfaceEffect(
             mainThreadExecutor(),
             FakeSurfaceProcessor(mainThreadExecutor())
         )
@@ -159,19 +159,19 @@
         waitUtilPreviewViewIsReady(previewView!!)
 
         // Act: set an effect
-        val effect = FakePreviewEffect(
+        val effect = FakeSurfaceEffect(
             mainThreadExecutor(), FakeSurfaceProcessor(mainThreadExecutor())
         )
         instrumentation.runOnMainSync { controller!!.setEffects(setOf(effect)) }
 
         // Assert: preview has effect
-        assertThat(controller!!.mPreview.processor).isNotNull()
+        assertThat(controller!!.mPreview.effect).isNotNull()
 
         // Act: clear the effects
         instrumentation.runOnMainSync { controller!!.setEffects(null) }
 
         // Assert: preview no longer has the effect.
-        assertThat(controller!!.mPreview.processor).isNull()
+        assertThat(controller!!.mPreview.effect).isNull()
     }
 
     @Test
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/camera-view/src/main/java/androidx/camera/view/CameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
index 2ed53fc..3602e67 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
@@ -1435,6 +1435,7 @@
             return;
         }
         mVideoCaptureQuality = targetQuality;
+        unbindVideoAndRecreate();
         startCameraAndTrackStates();
     }
 
@@ -1450,6 +1451,16 @@
         return mVideoCaptureQuality;
     }
 
+    /**
+     * Unbinds VideoCapture and recreate with the latest parameters.
+     */
+    private void unbindVideoAndRecreate() {
+        if (isCameraInitialized()) {
+            mCameraProvider.unbind(mVideoCapture);
+        }
+        mVideoCapture = createNewVideoCapture();
+    }
+
     private VideoCapture<Recorder> createNewVideoCapture() {
         return VideoCapture.withOutput(generateVideoCaptureRecorder(mVideoCaptureQuality));
     }
@@ -2002,11 +2013,10 @@
             mCameraProvider.unbind(mImageAnalysis);
         }
 
-        // TODO: revert aosp/2280599 to reuse VideoCapture when VideoCapture supports reuse.
-        mCameraProvider.unbind(mVideoCapture);
         if (isVideoCaptureEnabled()) {
-            mVideoCapture = createNewVideoCapture();
             builder.addUseCase(mVideoCapture);
+        } else {
+            mCameraProvider.unbind(mVideoCapture);
         }
 
         builder.setViewPort(mViewPort);
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/ZoomControlDeviceTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ZoomControlDeviceTest.kt
new file mode 100644
index 0000000..1b89972
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ZoomControlDeviceTest.kt
@@ -0,0 +1,844 @@
+/*
+ * 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 {
+        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 {
+        val maxZoomRatio = cameraInfo.zoomState.value!!.maxZoomRatio
+        val result = cameraControl.setZoomRatio(maxZoomRatio + 1.0f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun setZoomRatio_smallerThanMin_zoomUnmodified() = runBlocking {
+        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 {
+        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 {
+        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 {
+        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 {
+        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 {
+        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 {
+        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 {
+        val result = cameraControl.setLinearZoom(1.1f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun setLinearZoom_smallerThan0_zoomUnmodified() = runBlocking {
+        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 {
+        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 {
+        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/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 14e3df0..84311e9 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -37,6 +37,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.res.Configuration;
 import android.database.Cursor;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.display.DisplayManager;
@@ -50,6 +51,7 @@
 import android.os.StrictMode;
 import android.os.SystemClock;
 import android.provider.MediaStore;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Range;
 import android.util.Rational;
@@ -59,6 +61,7 @@
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.widget.Button;
 import android.widget.CompoundButton;
@@ -83,6 +86,7 @@
 import androidx.camera.camera2.internal.compat.quirk.ImageCaptureFlashNotFireQuirk;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
+import androidx.camera.core.AspectRatio;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraFilter;
@@ -104,6 +108,7 @@
 import androidx.camera.core.ViewPort;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.impl.Quirks;
+import androidx.camera.core.impl.utils.AspectRatioUtil;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.video.FileOutputOptions;
@@ -192,6 +197,15 @@
     public static final String INTENT_EXTRA_CAMERA_IMPLEMENTATION = "camera_implementation";
     public static final String INTENT_EXTRA_CAMERA_IMPLEMENTATION_NO_HISTORY =
             "camera_implementation_no_history";
+
+    // Launch the activity with the specified target aspect ratio.
+    public static final String INTENT_EXTRA_TARGET_ASPECT_RATIO = "target_aspect_ratio";
+
+    // Launch the activity with the specified scale type. The default value is FILL_CENTER.
+    public static final String INTENT_EXTRA_SCALE_TYPE = "scale_type";
+    public static final int INTENT_EXTRA_FILL_CENTER = 1;
+    public static final int INTENT_EXTRA_FIT_CENTER = 4;
+
     // Launch the activity with the specified camera id.
     @VisibleForTesting
     public static final String INTENT_EXTRA_CAMERA_ID = "camera_id";
@@ -229,6 +243,10 @@
     private static final String DESCRIPTION_FLASH_MODE_NOT_SUPPORTED = "FLASH_MODE_NOT_SUPPORTED";
     private static final Quality QUALITY_AUTO = null;
 
+    // The target aspect ratio of Preview and ImageCapture. It can be adjusted by setting
+    // INTENT_EXTRA_TARGET_ASPECT_RATIO for the e2e testing.
+    private int mTargetAspectRatio = AspectRatio.RATIO_DEFAULT;
+
     private Recording mActiveRecording;
     /** The camera to use */
     CameraSelector mCurrentCameraSelector = BACK_SELECTOR;
@@ -987,6 +1005,34 @@
         }
     }
 
+    private void updatePreviewRatioAndScaleTypeByIntent(ViewStub viewFinderStub) {
+        Bundle bundle = this.getIntent().getExtras();
+        if (bundle != null) {
+            mTargetAspectRatio = bundle.getInt(INTENT_EXTRA_TARGET_ASPECT_RATIO,
+                    AspectRatio.RATIO_4_3);
+            int scaleType = bundle.getInt(INTENT_EXTRA_SCALE_TYPE, INTENT_EXTRA_FILL_CENTER);
+            if (scaleType == INTENT_EXTRA_FIT_CENTER) {
+                // Scale the view according to the target aspect ratio, display size and device
+                // orientation, so preview can be entirely contained within the view.
+                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+                Rational ratio = (mTargetAspectRatio == AspectRatio.RATIO_16_9)
+                        ? AspectRatioUtil.ASPECT_RATIO_16_9 : AspectRatioUtil.ASPECT_RATIO_4_3;
+                int orientation = getResources().getConfiguration().orientation;
+                ViewGroup.LayoutParams lp = viewFinderStub.getLayoutParams();
+                if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+                    lp.width = displayMetrics.widthPixels;
+                    lp.height = (int) (displayMetrics.widthPixels / ratio.getDenominator()
+                            * ratio.getNumerator());
+                } else {
+                    lp.height = displayMetrics.heightPixels;
+                    lp.width = (int) (displayMetrics.heightPixels / ratio.getDenominator()
+                            * ratio.getNumerator());
+                }
+                viewFinderStub.setLayoutParams(lp);
+            }
+        }
+    }
+
     @OptIn(markerClass = androidx.camera.core.ExperimentalZeroShutterLag.class)
     private void updateButtonsUi() {
         mRecordUi.setEnabled(mVideoToggle.isChecked());
@@ -1098,6 +1144,8 @@
         mImageCaptureExecutorService = Executors.newSingleThreadExecutor();
         OpenGLRenderer previewRenderer = mPreviewRenderer = new OpenGLRenderer();
         ViewStub viewFinderStub = findViewById(R.id.viewFinderStub);
+        updatePreviewRatioAndScaleTypeByIntent(viewFinderStub);
+
         mViewFinder = OpenGLActivity.chooseViewFinder(getIntent().getExtras(), viewFinderStub,
                 previewRenderer);
         mViewFinder.addOnLayoutChangeListener(
@@ -1407,6 +1455,7 @@
         if (mPreviewToggle.isChecked()) {
             Preview preview = new Preview.Builder()
                     .setTargetName("Preview")
+                    .setTargetAspectRatio(mTargetAspectRatio)
                     .build();
             resetViewIdlingResource();
             // Use the listener of the future to make sure the Preview setup the new surface.
@@ -1423,6 +1472,7 @@
         if (mPhotoToggle.isChecked()) {
             ImageCapture imageCapture = new ImageCapture.Builder()
                     .setCaptureMode(getCaptureMode())
+                    .setTargetAspectRatio(mTargetAspectRatio)
                     .setTargetName("ImageCapture")
                     .build();
             useCases.add(imageCapture);
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/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ComposeUiFragment.kt b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ComposeUiFragment.kt
index 0330c7d..6052d44 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ComposeUiFragment.kt
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ComposeUiFragment.kt
@@ -48,13 +48,24 @@
 
 class ComposeUiFragment : Fragment() {
 
+    var currentScaleType = PreviewView.ScaleType.FILL_CENTER
+
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
         val cameraProvider = ProcessCameraProvider.getInstance(requireContext()).get()
+        val bundle: Bundle? = requireActivity().intent.extras
+        if (bundle != null) {
+            val scaleTypeId = bundle.getInt(
+                MainActivity.INTENT_EXTRA_SCALE_TYPE,
+                MainActivity.DEFAULT_SCALE_TYPE_ID
+            )
+            currentScaleType = PreviewView.ScaleType.values()[scaleTypeId]
+        }
         val previewView = PreviewView(requireContext())
+        previewView.scaleType = currentScaleType
 
         return ComposeView(requireContext()).apply {
             setContent {
@@ -72,7 +83,6 @@
             ViewGroup.LayoutParams.MATCH_PARENT,
             ViewGroup.LayoutParams.MATCH_PARENT
         )
-        previewView.scaleType = PreviewView.ScaleType.FILL_CENTER
 
         AndroidView(
             factory = {
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
index eb5dc31..970b5d8 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
@@ -77,6 +77,11 @@
     public static final String INTENT_EXTRA_E2E_TEST_CASE = "e2e_test_case";
     public static final String PREVIEW_TEST_CASE = "preview_test_case";
 
+    // Launch the activity with the specified scale type.
+    public static final String INTENT_EXTRA_SCALE_TYPE = "scale_type";
+    // The default scale type is FILL_CENTER.
+    public static final int DEFAULT_SCALE_TYPE_ID = 1;
+
     /** Intent extra representing type of camera implementation. */
     public static final String INTENT_EXTRA_CAMERA_IMPLEMENTATION = "camera_implementation";
 
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
index 1432160..d918398 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
@@ -18,8 +18,10 @@
 
 import static androidx.camera.integration.view.MainActivity.CAMERA_DIRECTION_BACK;
 import static androidx.camera.integration.view.MainActivity.CAMERA_DIRECTION_FRONT;
+import static androidx.camera.integration.view.MainActivity.DEFAULT_SCALE_TYPE_ID;
 import static androidx.camera.integration.view.MainActivity.INTENT_EXTRA_CAMERA_DIRECTION;
 import static androidx.camera.integration.view.MainActivity.INTENT_EXTRA_E2E_TEST_CASE;
+import static androidx.camera.integration.view.MainActivity.INTENT_EXTRA_SCALE_TYPE;
 import static androidx.camera.integration.view.MainActivity.PREVIEW_TEST_CASE;
 import static androidx.camera.view.PreviewView.StreamState.IDLE;
 import static androidx.camera.view.PreviewView.StreamState.STREAMING;
@@ -85,6 +87,7 @@
     @SuppressWarnings("WeakerAccess")
     int mCurrentLensFacing = CameraSelector.LENS_FACING_BACK;
     private BlurBitmap mBlurBitmap;
+    private PreviewView.ScaleType mCurrentScaleType = PreviewView.ScaleType.FILL_CENTER;
 
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
@@ -117,8 +120,11 @@
                     controller.setVisibility(View.GONE);
                 }
             }
+            int scaleTypeId = bundle.getInt(INTENT_EXTRA_SCALE_TYPE, DEFAULT_SCALE_TYPE_ID);
+            mCurrentScaleType = PreviewView.ScaleType.values()[scaleTypeId];
         }
         mPreviewView = view.findViewById(R.id.preview_view);
+        mPreviewView.setScaleType(mCurrentScaleType);
         mPreviewView.setImplementationMode(PreviewView.ImplementationMode.COMPATIBLE);
         mPreviewView.addOnLayoutChangeListener(
                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom)
@@ -307,18 +313,16 @@
         final Spinner scaleTypeSpinner = rootView.findViewById(R.id.scale_type);
         scaleTypeSpinner.setAdapter(adapter);
 
-        // Default value
-        final PreviewView.ScaleType currentScaleType = mPreviewView.getScaleType();
         final String currentScaleTypeLiteral =
-                PreviewViewScaleTypePresenter.getLiteralForScaleType(currentScaleType);
+                PreviewViewScaleTypePresenter.getLiteralForScaleType(mCurrentScaleType);
         final int defaultSelection = adapter.getPosition(currentScaleTypeLiteral);
         scaleTypeSpinner.setSelection(defaultSelection, false);
 
         scaleTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                final PreviewView.ScaleType scaleType = PreviewView.ScaleType.values()[position];
-                mPreviewView.setScaleType(scaleType);
+                mCurrentScaleType = PreviewView.ScaleType.values()[position];
+                mPreviewView.setScaleType(mCurrentScaleType);
 
                 // Update the preview snapshot ImageView to have a scaleType matching that of the
                 // PreviewView.
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppActivityTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
index 5d97b81..02804af 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
@@ -117,7 +117,7 @@
             ShadowApplication sa = shadowOf(app);
             sa.setComponentNameAndServiceForBindService(mRendererComponent, mRenderServiceDelegate);
 
-        } catch (PackageManager.NameNotFoundException | RemoteException e) {
+        } catch (RemoteException e) {
             fail(Log.getStackTraceString(e));
         }
     }
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java
index 76ab41e..b7cb763 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java
@@ -21,6 +21,9 @@
 import androidx.annotation.NonNull;
 import androidx.car.app.CarContext;
 import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.ItemList;
 import androidx.car.app.model.ListTemplate;
 import androidx.car.app.model.Row;
@@ -32,37 +35,81 @@
 import androidx.car.app.sample.showcase.common.screens.templatelayouts.PaneTemplateDemoScreen;
 import androidx.car.app.sample.showcase.common.screens.templatelayouts.SearchTemplateDemoScreen;
 import androidx.car.app.sample.showcase.common.screens.templatelayouts.SignInTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.TabTemplateLayoutsDemoScreen;
+import androidx.car.app.versioning.CarAppApiLevels;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /** A screen demonstrating different template layouts. */
 public final class TemplateLayoutsDemoScreen extends Screen {
+    private static final int MAX_PAGES = 2;
+
+    private int mPage;
 
     public TemplateLayoutsDemoScreen(@NonNull CarContext carContext) {
         super(carContext);
+        mPage = 0;
     }
 
     @NonNull
     @Override
     public Template onGetTemplate() {
-        ItemList.Builder listBuilder = new ItemList.Builder();
-
-        listBuilder.addItem(buildRowForTemplate(new ListTemplateDemoScreen(getCarContext()),
+        List<Row> screenList = new ArrayList<>();
+        screenList.add(buildRowForTemplate(new ListTemplateDemoScreen(getCarContext()),
                 R.string.list_template_demo_title));
-        listBuilder.addItem(buildRowForTemplate(new GridTemplateMenuDemoScreen(getCarContext()),
+        screenList.add(buildRowForTemplate(new GridTemplateMenuDemoScreen(getCarContext()),
                 R.string.grid_template_menu_demo_title));
-        listBuilder.addItem(buildRowForTemplate(new MessageTemplateDemoScreen(getCarContext()),
+        screenList.add(buildRowForTemplate(new MessageTemplateDemoScreen(getCarContext()),
                 R.string.msg_template_demo_title));
-        listBuilder.addItem(buildRowForTemplate(new PaneTemplateDemoScreen(getCarContext()),
+        screenList.add(buildRowForTemplate(new PaneTemplateDemoScreen(getCarContext()),
                 R.string.pane_template_demo_title));
-        listBuilder.addItem(buildRowForTemplate(new SearchTemplateDemoScreen(getCarContext()),
+        screenList.add(buildRowForTemplate(new SearchTemplateDemoScreen(getCarContext()),
                 R.string.search_template_demo_title));
-        listBuilder.addItem(buildRowForTemplate(new SignInTemplateDemoScreen(getCarContext()),
+        screenList.add(buildRowForTemplate(new SignInTemplateDemoScreen(getCarContext()),
                 R.string.sign_in_template_demo_title));
+        if (getCarContext().getCarAppApiLevel() >= CarAppApiLevels.LEVEL_6) {
+            screenList.add(buildRowForTemplate(new TabTemplateLayoutsDemoScreen(getCarContext()),
+                    R.string.tab_template_layouts_demo_title));
+        }
 
-        return new ListTemplate.Builder()
+        int listLimit = getCarContext().getCarService(ConstraintManager.class).getContentLimit(
+                ConstraintManager.CONTENT_LIMIT_TYPE_LIST);
+
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        // If the screenArray size is under the limit, we will show all of them on the first page.
+        // Otherwise we will show them in multiple pages.
+        if (screenList.size() <= listLimit) {
+            for (int i = 0; i < screenList.size(); i++) {
+                listBuilder.addItem(screenList.get(i));
+            }
+        } else {
+            int currentItemStartIndex = mPage * listLimit;
+            int currentItemEndIndex = Math.min(currentItemStartIndex + listLimit,
+                    screenList.size());
+            for (int i = currentItemStartIndex; i < currentItemEndIndex; i++) {
+                listBuilder.addItem(screenList.get(i));
+            }
+        }
+
+        ListTemplate.Builder builder = new ListTemplate.Builder()
                 .setSingleList(listBuilder.build())
                 .setTitle(getCarContext().getString(R.string.template_layouts_demo_title))
-                .setHeaderAction(BACK)
-                .build();
+                .setHeaderAction(BACK);
+
+        // If the current page does not cover the last item, we will show a More button
+        if ((mPage + 1) * listLimit < screenList.size() && mPage + 1 < MAX_PAGES) {
+            builder.setActionStrip(new ActionStrip.Builder()
+                    .addAction(new Action.Builder()
+                            .setTitle(getCarContext().getString(R.string.more_action_title))
+                            .setOnClickListener(() -> {
+                                mPage++;
+                                invalidate();
+                            })
+                            .build())
+                    .build());
+        }
+        return builder.build();
     }
 
     private Row buildRowForTemplate(Screen screen, int title) {
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/TabTemplateLayoutsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/TabTemplateLayoutsDemoScreen.java
new file mode 100644
index 0000000..4cb3772
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/TabTemplateLayoutsDemoScreen.java
@@ -0,0 +1,64 @@
+/*
+ * 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.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates.TabTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates.TabTemplateLoadingDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates.TabTemplateNoTabsDemoScreen;
+
+/** A screen demonstrating different tab template layouts. */
+public final class TabTemplateLayoutsDemoScreen extends Screen {
+
+    public TabTemplateLayoutsDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        listBuilder.addItem(buildRowForTemplate(new TabTemplateDemoScreen(getCarContext()),
+                R.string.tab_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new TabTemplateLoadingDemoScreen(getCarContext()),
+                R.string.tab_template_loading_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new TabTemplateNoTabsDemoScreen(getCarContext()),
+                R.string.tab_template_no_tabs_demo_title));
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.tab_template_layouts_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+}
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/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateDemoScreen.java
new file mode 100644
index 0000000..af4b1c3
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateDemoScreen.java
@@ -0,0 +1,202 @@
+/*
+ * 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.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates;
+
+import static androidx.car.app.model.Action.APP_ICON;
+
+import android.annotation.SuppressLint;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.GridItem;
+import androidx.car.app.model.GridTemplate;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.Pane;
+import androidx.car.app.model.PaneTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Tab;
+import androidx.car.app.model.TabContents;
+import androidx.car.app.model.TabTemplate;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.graphics.drawable.IconCompat;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link TabTemplate}.
+ */
+public final class TabTemplateDemoScreen extends Screen {
+    private static final int LIST_SIZE = 10;
+    private static final int[] TITLE_RES_IDS = new int[]{
+            R.string.tab_title_message,
+            R.string.tab_title_pane,
+            R.string.tab_title_list,
+            R.string.tab_title_grid
+    };
+
+    private static final int[] ICON_RES_IDS = new int[]{
+            R.drawable.ic_explore_white_24dp,
+            R.drawable.ic_face_24px,
+            R.drawable.ic_place_white_24dp,
+            R.drawable.ic_favorite_white_24dp
+    };
+
+    private final Map<String, Tab> mTabs;
+    private final Map<String, TabContents> mTabContentsMap;
+    private TabTemplate.Builder mTabTemplateBuilder;
+    private String mActiveContentId;
+
+    public TabTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        mTabs = new HashMap<>();
+        mTabContentsMap = new HashMap<>();
+        mActiveContentId = null;
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        mTabTemplateBuilder = new TabTemplate.Builder(new TabTemplate.TabCallback() {
+            @SuppressLint("SyntheticAccessor")
+            @Override
+            public void onTabSelected(@NonNull String tabContentId) {
+                mActiveContentId = tabContentId;
+                invalidate();
+            }
+        }).setHeaderAction(APP_ICON);
+
+        mTabContentsMap.clear();
+        mTabs.clear();
+
+        for (int i = 0; i < ICON_RES_IDS.length; i++) {
+            String contentId = String.valueOf(i);
+
+            Template contentTemplate;
+            switch (i) {
+                case 0:
+                    contentTemplate = createShortMessageTemplate();
+                    break;
+                case 1:
+                    contentTemplate = createPaneTemplate();
+                    break;
+                case 2:
+                    contentTemplate = createListTemplate();
+                    break;
+                case 3:
+                default:
+                    contentTemplate = createGridTemplate();
+                    break;
+            }
+            TabContents tabContents = new TabContents.Builder(contentTemplate).build();
+            mTabContentsMap.put(contentId, tabContents);
+
+            Tab.Builder tabBuilder = new Tab.Builder()
+                    .setTitle(getCarContext().getString(TITLE_RES_IDS[i]))
+                    .setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(),
+                            ICON_RES_IDS[i])).build())
+                    .setContentId(contentId);
+            if (TextUtils.isEmpty(mActiveContentId) && i == 0) {
+                tabBuilder.setActive(true);
+                mTabTemplateBuilder.setTabContents(tabContents);
+            } else if (TextUtils.equals(mActiveContentId, contentId)) {
+                tabBuilder.setActive(true);
+                mTabTemplateBuilder.setTabContents(tabContents);
+            } else {
+                tabBuilder.setActive(false);
+            }
+
+            Tab tab = tabBuilder.build();
+            mTabs.put(tab.getContentId(), tab);
+            mTabTemplateBuilder.addTab(tab);
+        }
+        return mTabTemplateBuilder.build();
+    }
+
+    private ListTemplate createListTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        for (int i = 0; i < LIST_SIZE; i++) {
+            listBuilder.addItem(buildRowForTemplate(String.valueOf(i), true));
+        }
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .build();
+    }
+
+    private Row buildRowForTemplate(CharSequence title, boolean clickable) {
+        Row.Builder rowBuilder = new Row.Builder()
+                .setTitle(title);
+        if (clickable) {
+            rowBuilder.setOnClickListener(() -> CarToast.makeText(getCarContext(), title,
+                    CarToast.LENGTH_SHORT).show());
+        }
+        return rowBuilder.build();
+    }
+
+    private GridTemplate createGridTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        for (int i = 0; i < LIST_SIZE; i++) {
+            listBuilder.addItem(buildGridItemForTemplate(String.valueOf(i)));
+        }
+        return new GridTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .build();
+    }
+
+    private GridItem buildGridItemForTemplate(CharSequence title) {
+        return new GridItem.Builder()
+                .setImage(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(),
+                                R.drawable.ic_emoji_food_beverage_white_48dp)).build(),
+                        GridItem.IMAGE_TYPE_ICON)
+                .setTitle(title)
+                .build();
+    }
+
+    private MessageTemplate createShortMessageTemplate() {
+        Action action = new Action.Builder()
+                .setTitle(getCarContext().getString(R.string.back_caps_action_title))
+                .setIcon(CarIcon.BACK)
+                .setOnClickListener(() -> getScreenManager().pop())
+                .build();
+        return new MessageTemplate.Builder(
+                getCarContext().getString(R.string.msg_template_demo_text))
+                .setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(),
+                        R.drawable.ic_launcher)).build())
+                .addAction(action)
+                .build();
+    }
+
+    private PaneTemplate createPaneTemplate() {
+        Pane.Builder paneBuilder = new Pane.Builder()
+                .setImage(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(),
+                        R.drawable.ic_launcher)).build());
+        for (int i = 0; i < LIST_SIZE; i++) {
+            paneBuilder.addRow(buildRowForTemplate(String.valueOf(i), false));
+        }
+        return new PaneTemplate.Builder(paneBuilder.build())
+                .build();
+    }
+
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateLoadingDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateLoadingDemoScreen.java
new file mode 100644
index 0000000..ee434b7
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateLoadingDemoScreen.java
@@ -0,0 +1,137 @@
+/*
+ * 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.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates;
+
+import static androidx.car.app.model.Action.APP_ICON;
+
+import android.annotation.SuppressLint;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.SearchTemplate;
+import androidx.car.app.model.Tab;
+import androidx.car.app.model.TabContents;
+import androidx.car.app.model.TabTemplate;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.graphics.drawable.IconCompat;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link TabTemplate} with loading
+ * state.
+ */
+public final class TabTemplateLoadingDemoScreen extends Screen {
+    private static final int[] sTitleResIds = new int[]{
+            R.string.tab_title_message, R.string.tab_title_search
+    };
+
+    private static final int[] sIconResIds = new int[]{
+            R.drawable.ic_explore_white_24dp,
+            R.drawable.ic_face_24px
+    };
+
+    private final Map<String, Tab> mTabs;
+    private TabTemplate.Builder mTabTemplateBuilder;
+    private String mActiveContentId;
+
+    public TabTemplateLoadingDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        mTabs = new HashMap<>();
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        mTabTemplateBuilder = new TabTemplate.Builder(new TabTemplate.TabCallback() {
+            @SuppressLint("SyntheticAccessor")
+            @Override
+            public void onTabSelected(@NonNull String tabContentId) {
+                mActiveContentId = tabContentId;
+                invalidate();
+            }
+        })
+                .setHeaderAction(APP_ICON);
+
+        mTabs.clear();
+
+        for (int i = 0; i < 2; i++) {
+            String contentId = String.valueOf(i);
+
+            Tab.Builder tabBuilder = new Tab.Builder()
+                    .setTitle(getCarContext().getString(sTitleResIds[i]))
+                    .setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(),
+                            sIconResIds[i])).build())
+                    .setContentId(contentId);
+            if (TextUtils.isEmpty(mActiveContentId) && i == 0) {
+                tabBuilder.setActive(true);
+            } else if (TextUtils.equals(mActiveContentId, contentId)) {
+                tabBuilder.setActive(true);
+            } else {
+                tabBuilder.setActive(false);
+            }
+
+            Tab tab = tabBuilder.build();
+            mTabs.put(tab.getContentId(), tab);
+            mTabTemplateBuilder.addTab(tab);
+
+            if (tab.isActive()) {
+                if (i == 0) {
+                    mTabTemplateBuilder.setLoading(true);
+                } else {
+                    mTabTemplateBuilder.setTabContents(createSearchTab());
+                }
+            }
+        }
+        return mTabTemplateBuilder.build();
+    }
+
+    private TabContents createSearchTab() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        for (int i = 1; i <= 6; ++i) {
+            listBuilder.addItem(
+                    new Row.Builder()
+                            .setTitle(
+                                    getCarContext().getString(R.string.back_caps_action_title) + " "
+                                            + i)
+                            .addText("Tap to go back to previous screen")
+                            .setOnClickListener(() -> getScreenManager().pop())
+                            .build());
+        }
+        SearchTemplate searchTemplate = new SearchTemplate.Builder(
+                new SearchTemplate.SearchCallback() {
+                    @Override
+                    public void onSearchSubmitted(@NonNull String searchText) {
+                        CarToast.makeText(getCarContext(), searchText,
+                                CarToast.LENGTH_SHORT).show();
+                    }
+                })
+                .setItemList(listBuilder.build())
+                .setShowKeyboardByDefault(true)
+                .build();
+        return new TabContents.Builder(searchTemplate).build();
+    }
+
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateNoTabsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateNoTabsDemoScreen.java
new file mode 100644
index 0000000..38c7368
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/tabtemplates/TabTemplateNoTabsDemoScreen.java
@@ -0,0 +1,62 @@
+/*
+ * 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.car.app.sample.showcase.common.screens.templatelayouts.tabtemplates;
+
+import static androidx.car.app.model.Action.APP_ICON;
+
+import android.annotation.SuppressLint;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.TabTemplate;
+import androidx.car.app.model.Template;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link TabTemplate} without tabs.
+ */
+public final class TabTemplateNoTabsDemoScreen extends Screen {
+    private TabTemplate.Builder mTabTemplateBuilder;
+
+    public TabTemplateNoTabsDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        mTabTemplateBuilder = new TabTemplate.Builder(new TabTemplate.TabCallback() {
+            @SuppressLint("SyntheticAccessor")
+            @Override
+            public void onTabSelected(@NonNull String tabContentId) {
+                // No-op
+            }
+        })
+                .setHeaderAction(APP_ICON)
+                .setLoading(true);
+
+        new Handler(getCarContext().getMainLooper()).postDelayed(() -> {
+            getScreenManager().pop();
+            CarToast.makeText(getCarContext(), "Back to previous screen",
+                    CarToast.LENGTH_SHORT).show();
+        }, 5000);
+        return mTabTemplateBuilder.build();
+    }
+
+}
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
index 93dddc8..cc0fa9d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
@@ -67,7 +67,7 @@
     <string name="parked_toast_msg" msgid="2532422265890824446">"\"Aparkatutakoak\" ekintza"</string>
     <string name="more_toast_msg" msgid="5938288138225509885">"\"Gehiago\" sakatuta dago"</string>
     <string name="commute_toast_msg" msgid="4112684360647638688">"Eguneroko joan-etorrien botoia sakatuta dago"</string>
-    <string name="grant_location_permission_toast_msg" msgid="268046297444808010">"Eman kokapena atzitzeko baimena oraingo kokapena ikusteko"</string>
+    <string name="grant_location_permission_toast_msg" msgid="268046297444808010">"Eman kokapena erabiltzeko baimena oraingo kokapena ikusteko"</string>
     <string name="sign_in_with_google_toast_msg" msgid="5720947549233124775">"Hemen hasten da Google-ko kontuarekin saioa hasteko prozesua"</string>
     <string name="changes_selection_to_index_toast_msg_prefix" msgid="957766225794389167">"Hautapena indizera aldatu da"</string>
     <string name="yes_action_toast_msg" msgid="6216215197177241247">"\"Bai\" botoia sakatu da"</string>
@@ -327,9 +327,9 @@
     <string name="perm_group" msgid="3834918337351876270">"Baimenen taldea"</string>
     <string name="perm_group_description" msgid="7348847631139139024">"Showcase aplikazioaren baimenen taldea"</string>
     <string name="perm_fine_location" msgid="5438874642600304118">"Kokapen zehatzerako sarbidea"</string>
-    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Kokapen zehatza atzitzeko baimena"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Kokapen zehatza erabiltzeko baimena"</string>
     <string name="perm_coarse_location" msgid="6140337431619481015">"Gutxi gorabeherako kokapenerako sarbidea"</string>
-    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Gutxi gorabeherako kokapena atzitzeko baimena"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Gutxi gorabeherako kokapena erabiltzeko baimena"</string>
     <string name="perm_record_audio" msgid="2758340693260523493">"Audioa grabatzeko sarbidea"</string>
     <string name="perm_record_audio_desc" msgid="8038648467605928912">"Audioa grabatzeko baimena"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Baliabide-bektore tonuduna"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
index 346a91d..74281f3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
@@ -327,6 +327,17 @@
   <string name="sign_in_complete_title">Sign in completed</string>
   <string name="sign_in_template_demo_title">Sign In Template Demo</string>
 
+  <!-- TabTemplateScreen -->
+  <string name="tab_template_layouts_demo_title">Tab Template Demos</string>
+  <string name="tab_template_demo_title">Tab Template Demo</string>
+  <string name="tab_title_message">Message Tab</string>
+  <string name="tab_title_pane">Pane Tab</string>
+  <string name="tab_title_list">List Tab</string>
+  <string name="tab_title_grid">Grid Tab with Long Tab Title</string>
+  <string name="tab_title_search">Search Tab</string>
+  <string name="tab_template_loading_demo_title">Tab Template Loading Demo</string>
+  <string name="tab_template_no_tabs_demo_title">Tab Template No Tabs Demo</string>
+
   <!-- ContentProviderIconsDemoScreen -->
   <string name="images_unknown_host_error">Images cannot be displayed for an unknown host</string>
   <string name="icon_title_prefix">Icon</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/messaging/model/CarMessage.java b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
index 439cb47..26429f7 100644
--- a/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
+++ b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
@@ -143,7 +143,7 @@
         return mReceivedTimeEpochMillis;
     }
 
-    /** Returns a {@link boolean}, indicating whether the message has been read */
+    /** Returns a {@code boolean}, indicating whether the message has been read */
     public boolean isRead() {
         return mIsRead;
     }
@@ -175,7 +175,7 @@
             return this;
         }
 
-        /** Sets a {@link boolean}, indicating whether the message has been read */
+        /** Sets a {@code boolean}, indicating whether the message has been read */
         public @NonNull Builder setRead(boolean isRead) {
             mIsRead = isRead;
             return this;
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/connection/CarConnectionTypeLiveDataTest.java b/car/app/app/src/test/java/androidx/car/app/connection/CarConnectionTypeLiveDataTest.java
index f83a668..d6b1cf4 100644
--- a/car/app/app/src/test/java/androidx/car/app/connection/CarConnectionTypeLiveDataTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/connection/CarConnectionTypeLiveDataTest.java
@@ -38,6 +38,9 @@
 import androidx.lifecycle.Observer;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -69,6 +72,22 @@
     private CarConnectionTypeLiveData mCarConnectionTypeLiveData;
     private TestContentProvider mContentProvider;
 
+    /**
+     * Filters receivers to only ones created by the androidx.car group, filtering out for
+     * example the ProfileInstallReceiver which *may* be present, based on inclusion of
+     * profileinstaller (for example, in CI when tested against TOT dependencies).
+     * <p>
+     * To force its presence for local testing, add the following to car:app:app's build.gradle:
+     * <pre>implementation("androidx.profileinstaller:profileinstaller:1.2.1")</pre>
+     */
+    private ImmutableList<ShadowApplication.Wrapper> getFilteredRegisteredReceivers() {
+        return ImmutableList.copyOf(
+                Iterables.filter(shadowOf(mApplication).getRegisteredReceivers(),
+                        wrapper -> wrapper.broadcastReceiver.getClass().getName().startsWith(
+                                "androidx.car.app.")
+                ));
+    }
+
     @Before
     public void setUp() {
         ProviderInfo info = new ProviderInfo();
@@ -77,7 +96,7 @@
                 Robolectric.buildContentProvider(TestContentProvider.class).create(info).get();
 
         // Starts with 1 broadcast receiver (for CarPendingIntent)
-        assertThat(shadowOf(mApplication).getRegisteredReceivers()).hasSize(1);
+        assertThat(getFilteredRegisteredReceivers()).hasSize(1);
 
         mCarConnectionTypeLiveData = new CarConnectionTypeLiveData(mContext);
     }
@@ -90,7 +109,7 @@
         mCarConnectionTypeLiveData.observeForever(mMockObserver);
 
         ShadowApplication.Wrapper registeredReceiver =
-                shadowOf(mApplication).getRegisteredReceivers().get(0);
+                getFilteredRegisteredReceivers().get(0);
         assertThat(registeredReceiver.broadcastReceiver).isNotNull();
         assertThat(registeredReceiver.flags).isEqualTo(0);
     }
@@ -104,7 +123,7 @@
         mCarConnectionTypeLiveData.observeForever(mMockObserver);
 
         ShadowApplication.Wrapper registeredReceiver =
-                shadowOf(mApplication).getRegisteredReceivers().get(0);
+                getFilteredRegisteredReceivers().get(0);
         assertThat(registeredReceiver.broadcastReceiver).isNotNull();
         assertThat(registeredReceiver.flags).isEqualTo(Context.RECEIVER_EXPORTED);
     }
@@ -162,8 +181,7 @@
         mCarConnectionTypeLiveData.observeForever(mMockObserver);
         ShadowLooper.runUiThreadTasks();
 
-        ShadowApplication.Wrapper receiverWrapper = shadowOf(
-                mApplication).getRegisteredReceivers().get(1);
+        ShadowApplication.Wrapper receiverWrapper = getFilteredRegisteredReceivers().get(1);
 
         mContentProvider.mIsProjecting = true;
         receiverWrapper.broadcastReceiver.onReceive(mContext,
@@ -177,15 +195,15 @@
 
     @Test
     public void stopObserving_removedBroadcastReceiver() {
-        assertThat(shadowOf(mApplication).getRegisteredReceivers()).hasSize(1);
+        assertThat(getFilteredRegisteredReceivers()).hasSize(1);
 
         mCarConnectionTypeLiveData.observeForever(mMockObserver);
 
-        assertThat(shadowOf(mApplication).getRegisteredReceivers()).hasSize(2);
+        assertThat(getFilteredRegisteredReceivers()).hasSize(2);
 
         mCarConnectionTypeLiveData.removeObserver(mMockObserver);
 
-        assertThat(shadowOf(mApplication).getRegisteredReceivers()).hasSize(1);
+        assertThat(getFilteredRegisteredReceivers()).hasSize(1);
     }
 
     private static class TestContentProvider extends ContentProvider {
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
index 26d75c7..06524e6 100644
--- a/compose/animation/animation-core/api/1.4.0-beta01.txt
+++ b/compose/animation/animation-core/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/animation/animation-core/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..06524e6
--- /dev/null
+++ b/compose/animation/animation-core/api/1.4.0-beta02.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
deleted file mode 100644
index ae54e41..0000000
--- a/compose/animation/animation-core/api/current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.compose.animation.core.InfiniteTransitionKt#animateFloat(androidx.compose.animation.core.InfiniteTransition, float, float, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float>):
-    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>
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
index 230d118..60b552a 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/animation/animation-core/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..60b552a
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/animation/animation-core/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-core/api/res-1.4.0-beta02.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
index 7e756ae..9863fd5 100644
--- a/compose/animation/animation-core/api/restricted_1.4.0-beta01.txt
+++ b/compose/animation/animation-core/api/restricted_1.4.0-beta01.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-core/api/restricted_1.4.0-beta02.txt b/compose/animation/animation-core/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..9863fd5
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index ae54e41..0000000
--- a/compose/animation/animation-core/api/restricted_current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.compose.animation.core.InfiniteTransitionKt#animateFloat(androidx.compose.animation.core.InfiniteTransition, float, float, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float>):
-    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>
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
index 9c4ad0e..e6f50d0 100644
--- a/compose/animation/animation-graphics/api/1.4.0-beta01.txt
+++ b/compose/animation/animation-graphics/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/animation/animation-graphics/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/animation/animation-graphics/api/1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
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
index 08a1623..cf4d086 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/animation/animation-graphics/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..cf4d086
--- /dev/null
+++ b/compose/animation/animation-graphics/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/animation/animation-graphics/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-graphics/api/res-1.4.0-beta02.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
index 9c4ad0e..e6f50d0 100644
--- a/compose/animation/animation-graphics/api/restricted_1.4.0-beta01.txt
+++ b/compose/animation/animation-graphics/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/animation/animation-graphics/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/animation/animation-graphics/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
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-beta02.txt b/compose/animation/animation-tooling-internal/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/1.4.0-beta02.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-beta02.txt b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/animation/animation-tooling-internal/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/restricted_1.4.0-beta02.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
index 9a6e17a..9b1560f 100644
--- a/compose/animation/animation/api/1.4.0-beta01.txt
+++ b/compose/animation/animation/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/animation/animation/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..9b1560f
--- /dev/null
+++ b/compose/animation/animation/api/1.4.0-beta02.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
deleted file mode 100644
index 0b4033d..0000000
--- a/compose/animation/animation/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// 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>
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
index b34adcc..4e9addc 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/animation/animation/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..4e9addc
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/animation/animation/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation/api/res-1.4.0-beta02.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
index 9a6e17a..9b1560f 100644
--- a/compose/animation/animation/api/restricted_1.4.0-beta01.txt
+++ b/compose/animation/animation/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/animation/animation/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..9b1560f
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index 0b4033d..0000000
--- a/compose/animation/animation/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// 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>
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/foundation/foundation-layout/api/1.4.0-beta01.txt b/compose/foundation/foundation-layout/api/1.4.0-beta01.txt
index 98b9343..95dd32f 100644
--- a/compose/foundation/foundation-layout/api/1.4.0-beta01.txt
+++ b/compose/foundation/foundation-layout/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/foundation/foundation-layout/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..95dd32f
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.4.0-beta02.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.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
index 05b6344..d99d5f0 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..d99d5f0
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/foundation/foundation-layout/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/res-1.4.0-beta02.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
index f1576ee..3202872 100644
--- a/compose/foundation/foundation-layout/api/restricted_1.4.0-beta01.txt
+++ b/compose/foundation/foundation-layout/api/restricted_1.4.0-beta01.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/api/restricted_1.4.0-beta02.txt b/compose/foundation/foundation-layout/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..3202872
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.4.0-beta02.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.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/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
index 2e337c7..dc3c333 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
@@ -58,6 +58,7 @@
 import org.junit.runner.RunWith
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import org.junit.Assert.assertNotEquals
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
@@ -1486,6 +1487,7 @@
         assertEquals(Offset(root.width - size.toFloat(), 0f), childPosition.value)
     }
 
+    @SdkSuppress(maxSdkVersion = 32) // b/267699626
     @Test
     fun testWrapContentSize_rtl() = with(density) {
         val sizeDp = 200.toDp()
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-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/SelectableTextAnnotatedStringElement.kt b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/SelectableTextAnnotatedStringElement.kt
index 1514df6..0b4fa32 100644
--- a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/SelectableTextAnnotatedStringElement.kt
+++ b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/SelectableTextAnnotatedStringElement.kt
@@ -20,7 +20,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Placeholder
 import androidx.compose.ui.text.TextLayoutResult
@@ -29,7 +29,7 @@
 import androidx.compose.ui.text.style.TextOverflow
 
 @ExperimentalComposeUiApi
-internal class SelectableTextAnnotatedStringElement(
+internal data class SelectableTextAnnotatedStringElement(
     private val text: AnnotatedString,
     private val style: TextStyle,
     private val fontFamilyResolver: FontFamily.Resolver,
@@ -41,7 +41,8 @@
     private val placeholders: List<AnnotatedString.Range<Placeholder>>? = null,
     private val onPlaceholderLayout: ((List<Rect?>) -> Unit)? = null,
     private val selectionController: SelectionController? = null
-) : ModifierNodeElement<SelectableTextAnnotatedStringNode>(inspectorInfo = debugInspectorInfo { }) {
+) : ModifierNodeElement<SelectableTextAnnotatedStringNode>() {
+
     override fun create(): SelectableTextAnnotatedStringNode = SelectableTextAnnotatedStringNode(
         text,
         style,
@@ -101,8 +102,7 @@
     }
 
     override fun hashCode(): Int {
-        var result = super.hashCode()
-        result = 31 * result + text.hashCode()
+        var result = text.hashCode()
         result = 31 * result + style.hashCode()
         result = 31 * result + fontFamilyResolver.hashCode()
         result = 31 * result + (onTextLayout?.hashCode() ?: 0)
@@ -115,4 +115,8 @@
         result = 31 * result + (selectionController?.hashCode() ?: 0)
         return result
     }
+
+    override fun InspectorInfo.inspectableProperties() {
+        // Show nothing in the inspector.
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextAnnotatedStringElement.kt b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextAnnotatedStringElement.kt
index 1204125..e25f48a 100644
--- a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextAnnotatedStringElement.kt
+++ b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextAnnotatedStringElement.kt
@@ -20,7 +20,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Placeholder
 import androidx.compose.ui.text.TextLayoutResult
@@ -41,7 +41,8 @@
     private val placeholders: List<AnnotatedString.Range<Placeholder>>? = null,
     private val onPlaceholderLayout: ((List<Rect?>) -> Unit)? = null,
     private val selectionController: SelectionController? = null
-) : ModifierNodeElement<TextAnnotatedStringNode>(inspectorInfo = debugInspectorInfo { }) {
+) : ModifierNodeElement<TextAnnotatedStringNode>() {
+
     override fun create(): TextAnnotatedStringNode = TextAnnotatedStringNode(
         text,
         style,
@@ -105,8 +106,7 @@
     }
 
     override fun hashCode(): Int {
-        var result = super.hashCode()
-        result = 31 * result + text.hashCode()
+        var result = text.hashCode()
         result = 31 * result + style.hashCode()
         result = 31 * result + fontFamilyResolver.hashCode()
         result = 31 * result + (onTextLayout?.hashCode() ?: 0)
@@ -119,4 +119,8 @@
         result = 31 * result + (selectionController?.hashCode() ?: 0)
         return result
     }
+
+    override fun InspectorInfo.inspectableProperties() {
+        // Show nothing in the inspector.
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextStringSimpleElement.kt b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextStringSimpleElement.kt
index 2e2ed43..797e399 100644
--- a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextStringSimpleElement.kt
+++ b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/modifiers/TextStringSimpleElement.kt
@@ -19,7 +19,7 @@
 import androidx.compose.foundation.newtext.text.DefaultMinLines
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.style.TextOverflow
@@ -33,7 +33,8 @@
     private val softWrap: Boolean = true,
     private val maxLines: Int = Int.MAX_VALUE,
     private val minLines: Int = DefaultMinLines,
-) : ModifierNodeElement<TextStringSimpleNode>(inspectorInfo = debugInspectorInfo { }) {
+) : ModifierNodeElement<TextStringSimpleNode>() {
+
     override fun create(): TextStringSimpleNode = TextStringSimpleNode(
         text,
         style,
@@ -81,8 +82,7 @@
     }
 
     override fun hashCode(): Int {
-        var result = super.hashCode()
-        result = 31 * result + text.hashCode()
+        var result = text.hashCode()
         result = 31 * result + style.hashCode()
         result = 31 * result + fontFamilyResolver.hashCode()
         result = 31 * result + overflow.hashCode()
@@ -91,4 +91,8 @@
         result = 31 * result + minLines
         return result
     }
+
+    override fun InspectorInfo.inspectableProperties() {
+        // Show nothing in the inspector.
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/api/1.4.0-beta01.txt b/compose/foundation/foundation/api/1.4.0-beta01.txt
index 1c8281c..b8a93c56 100644
--- a/compose/foundation/foundation/api/1.4.0-beta01.txt
+++ b/compose/foundation/foundation/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/foundation/foundation/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..b8a93c56
--- /dev/null
+++ b/compose/foundation/foundation/api/1.4.0-beta02.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
deleted file mode 100644
index d1a4e31..0000000
--- a/compose/foundation/foundation/api/current.ignore
+++ /dev/null
@@ -1,17 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo#getMainAxisItemSpacing():
-    Added method androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo.getMainAxisItemSpacing()
-
-
-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.text.MaxLinesHeightModifierKt:
-    Removed class androidx.compose.foundation.text.MaxLinesHeightModifierKt
-
-
-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>)
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
index d74aeec..9918bcc 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/foundation/foundation/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..9918bcc
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/foundation/foundation/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation/api/res-1.4.0-beta02.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
index 1c8281c..b8a93c56 100644
--- a/compose/foundation/foundation/api/restricted_1.4.0-beta01.txt
+++ b/compose/foundation/foundation/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/foundation/foundation/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..b8a93c56
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index d1a4e31..0000000
--- a/compose/foundation/foundation/api/restricted_current.ignore
+++ /dev/null
@@ -1,17 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo#getMainAxisItemSpacing():
-    Added method androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo.getMainAxisItemSpacing()
-
-
-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.text.MaxLinesHeightModifierKt:
-    Removed class androidx.compose.foundation.text.MaxLinesHeightModifierKt
-
-
-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>)
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/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/ScrollableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
index 2345c6e..7f51f44 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
@@ -102,6 +102,7 @@
 import androidx.test.espresso.action.Swipe
 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 kotlin.math.abs
@@ -2341,6 +2342,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 32) // b/268753157
     @Test
     fun offsetsScrollable_velocityCalculationShouldConsiderLocalPositions() {
         // arrange
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/list/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
index 4ef8154..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
@@ -245,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()
+                }
             }
         }
     }
@@ -390,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..0a5cc61 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
@@ -2000,6 +2000,7 @@
             .assertStartPositionInRootIsEqualTo(0.dp)
     }
 
+    @SdkSuppress(maxSdkVersion = 32) // b/269178188
     @Test
     fun assertVelocityCalculationIsSimilar_witHistoricalValues() {
         // arrange
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
index 425ef13..ff4a3e3 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerNestedScrollContentTest.kt
@@ -35,6 +35,7 @@
 import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import kotlin.math.absoluteValue
 import kotlinx.coroutines.runBlocking
@@ -49,6 +50,7 @@
     config: ParamConfig
 ) : BasePagerTest(config = config) {
 
+    @SdkSuppress(maxSdkVersion = 32) // b/269171814
     @OptIn(ExperimentalFoundationApi::class)
     @Test
     fun nestedScrollContent_shouldNotPropagateUnconsumedFlings() {
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..8aa3c7a 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
@@ -30,6 +31,7 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performTouchInput
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.assertFalse
 import kotlinx.coroutines.Dispatchers
@@ -46,6 +48,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()
@@ -61,6 +86,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 32) // b/269176638
     @Test
     fun scrollToPage_usedOffset_shouldPlacePagesCorrectly() = runBlocking {
         // Arrange
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/LazyBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyBeyondBoundsModifier.kt
deleted file mode 100644
index df49b4e..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyBeyondBoundsModifier.kt
+++ /dev/null
@@ -1,184 +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.foundation.lazy
-
-import androidx.compose.foundation.gestures.Orientation
-import androidx.compose.foundation.lazy.LazyListBeyondBoundsInfo.Interval
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.layout.BeyondBoundsLayout
-import androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Above
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.After
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Before
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Below
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Left
-import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Right
-import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout
-import androidx.compose.ui.modifier.ModifierLocalProvider
-import androidx.compose.ui.modifier.ProvidableModifierLocal
-import androidx.compose.ui.platform.LocalLayoutDirection
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.LayoutDirection.Ltr
-import androidx.compose.ui.unit.LayoutDirection.Rtl
-
-/**
- * This modifier is used to measure and place additional items when the lazyList receives a
- * request to layout items beyond the visible bounds.
- */
-@Suppress("ComposableModifierFactory")
-@Composable
-internal fun Modifier.lazyListBeyondBoundsModifier(
-    state: LazyListState,
-    beyondBoundsInfo: LazyListBeyondBoundsInfo,
-    reverseLayout: Boolean,
-    orientation: Orientation
-): Modifier {
-    val layoutDirection = LocalLayoutDirection.current
-    return this then remember(
-        state,
-        beyondBoundsInfo,
-        reverseLayout,
-        layoutDirection,
-        orientation
-    ) {
-        LazyListBeyondBoundsModifierLocal(
-            state,
-            beyondBoundsInfo,
-            reverseLayout,
-            layoutDirection,
-            orientation
-        )
-    }
-}
-
-private class LazyListBeyondBoundsModifierLocal(
-    private val state: LazyListState,
-    private val beyondBoundsInfo: LazyListBeyondBoundsInfo,
-    private val reverseLayout: Boolean,
-    private val layoutDirection: LayoutDirection,
-    private val orientation: Orientation
-) : ModifierLocalProvider<BeyondBoundsLayout?>, BeyondBoundsLayout {
-    override val key: ProvidableModifierLocal<BeyondBoundsLayout?>
-        get() = ModifierLocalBeyondBoundsLayout
-    override val value: BeyondBoundsLayout
-        get() = this
-    companion object {
-        private val emptyBeyondBoundsScope = object : BeyondBoundsScope {
-            override val hasMoreContent = false
-        }
-    }
-
-    override fun <T> layout(
-        direction: BeyondBoundsLayout.LayoutDirection,
-        block: BeyondBoundsScope.() -> T?
-    ): T? {
-        // If the lazy list is empty, or if it does not have any visible items (Which implies
-        // that there isn't space to add a single item), we don't attempt to layout any more items.
-        if (state.layoutInfo.totalItemsCount <= 0 || state.layoutInfo.visibleItemsInfo.isEmpty()) {
-            return block.invoke(emptyBeyondBoundsScope)
-        }
-
-        // We use a new interval each time because this function is re-entrant.
-        var interval = beyondBoundsInfo.addInterval(
-            state.firstVisibleItemIndex,
-            state.layoutInfo.visibleItemsInfo.last().index
-        )
-
-        var found: T? = null
-        while (found == null && interval.hasMoreContent(direction)) {
-
-            // Add one extra beyond bounds item.
-            interval = addNextInterval(interval, direction).also {
-                beyondBoundsInfo.removeInterval(interval)
-            }
-            state.remeasurement?.forceRemeasure()
-
-            // When we invoke this block, the beyond bounds items are present.
-            found = block.invoke(
-                object : BeyondBoundsScope {
-                    override val hasMoreContent: Boolean
-                        get() = interval.hasMoreContent(direction)
-                }
-            )
-        }
-
-        // Dispose the items that are beyond the visible bounds.
-        beyondBoundsInfo.removeInterval(interval)
-        state.remeasurement?.forceRemeasure()
-        return found
-    }
-
-    private fun addNextInterval(
-        currentInterval: Interval,
-        direction: BeyondBoundsLayout.LayoutDirection
-    ): Interval {
-        var start = currentInterval.start
-        var end = currentInterval.end
-        when (direction) {
-            Before -> start--
-            After -> end++
-            Above -> if (reverseLayout) end++ else start--
-            Below -> if (reverseLayout) start-- else end++
-            Left -> when (layoutDirection) {
-                Ltr -> if (reverseLayout) end++ else start--
-                Rtl -> if (reverseLayout) start-- else end++
-            }
-            Right -> when (layoutDirection) {
-                Ltr -> if (reverseLayout) start-- else end++
-                Rtl -> if (reverseLayout) end++ else start--
-            }
-            else -> unsupportedDirection()
-        }
-        return beyondBoundsInfo.addInterval(start, end)
-    }
-
-    private fun Interval.hasMoreContent(direction: BeyondBoundsLayout.LayoutDirection): Boolean {
-        fun hasMoreItemsBefore() = start > 0
-        fun hasMoreItemsAfter() = end < state.layoutInfo.totalItemsCount - 1
-        if (direction.isOppositeToOrientation()) return false
-        return when (direction) {
-            Before -> hasMoreItemsBefore()
-            After -> hasMoreItemsAfter()
-            Above -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
-            Below -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
-            Left -> when (layoutDirection) {
-                Ltr -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
-                Rtl -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
-            }
-            Right -> when (layoutDirection) {
-                Ltr -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
-                Rtl -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
-            }
-            else -> unsupportedDirection()
-        }
-    }
-
-    private fun BeyondBoundsLayout.LayoutDirection.isOppositeToOrientation(): Boolean {
-        return when (this) {
-            Above, Below -> orientation == Orientation.Horizontal
-            Left, Right -> orientation == Orientation.Vertical
-            Before, After -> false
-            else -> unsupportedDirection()
-        }
-    }
-}
-
-private fun unsupportedDirection(): Nothing = error(
-    "Lazy list does not support beyond bounds layout for the specified direction"
-)
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..bde8eb6 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
@@ -77,8 +77,7 @@
 ) {
     val overscrollEffect = ScrollableDefaults.overscrollEffect()
     val itemProvider = rememberLazyListItemProvider(state, content)
-    val semanticState =
-        rememberLazyListSemanticState(state, itemProvider, reverseLayout, isVertical)
+    val semanticState = rememberLazyListSemanticState(state, isVertical)
     val beyondBoundsInfo = remember { LazyListBeyondBoundsInfo() }
     val scope = rememberCoroutineScope()
     val placementAnimator = remember(state, isVertical) {
@@ -112,7 +111,8 @@
                 itemProvider = itemProvider,
                 state = semanticState,
                 orientation = orientation,
-                userScrollEnabled = userScrollEnabled
+                userScrollEnabled = userScrollEnabled,
+                reverseScrolling = reverseLayout
             )
             .clipScrollableContainer(orientation)
             .lazyListBeyondBoundsModifier(state, beyondBoundsInfo, reverseLayout, orientation)
@@ -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/LazyListBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
new file mode 100644
index 0000000..d84e816
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.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.compose.foundation.lazy
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.lazy.layout.BeyondBoundsState
+import androidx.compose.foundation.lazy.layout.LazyLayoutBeyondBoundsModifierLocal
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLayoutDirection
+
+/**
+ * This modifier is used to measure and place additional items when the lazyList receives a
+ * request to layout items beyond the visible bounds.
+ */
+@Suppress("ComposableModifierFactory")
+@Composable
+internal fun Modifier.lazyListBeyondBoundsModifier(
+    state: LazyListState,
+    beyondBoundsInfo: LazyListBeyondBoundsInfo,
+    reverseLayout: Boolean,
+    orientation: Orientation
+): Modifier {
+    val layoutDirection = LocalLayoutDirection.current
+    val beyondBoundsState = remember(state) { LazyListBeyondBoundsState(state) }
+    return this then remember(
+        beyondBoundsState,
+        beyondBoundsInfo,
+        reverseLayout,
+        layoutDirection,
+        orientation
+    ) {
+        LazyLayoutBeyondBoundsModifierLocal(
+            beyondBoundsState,
+            beyondBoundsInfo,
+            reverseLayout,
+            layoutDirection,
+            orientation
+        )
+    }
+}
+
+internal class LazyListBeyondBoundsState(val state: LazyListState) : BeyondBoundsState {
+    override fun remeasure() {
+        state.remeasurement?.forceRemeasure()
+    }
+
+    override val itemCount: Int
+        get() = state.layoutInfo.totalItemsCount
+    override val hasVisibleItems: Boolean
+        get() = state.layoutInfo.visibleItemsInfo.isNotEmpty()
+    override val firstVisibleIndex: Int
+        get() = state.firstVisibleItemIndex
+    override val lastVisibleIndex: Int
+        get() = state.layoutInfo.visibleItemsInfo.last().index
+}
\ No newline at end of file
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/LazyListSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListSemantics.kt
new file mode 100644
index 0000000..5864b07
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListSemantics.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.lazy
+
+import androidx.compose.foundation.lazy.layout.LazyLayoutSemanticState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+@Composable
+internal fun rememberLazyListSemanticState(
+    state: LazyListState,
+    isVertical: Boolean
+): LazyLayoutSemanticState {
+    return remember(state, isVertical) {
+        LazyLayoutSemanticState(state = state, isVertical = isVertical)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
deleted file mode 100644
index 96bccd6..0000000
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.foundation.lazy
-
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.gestures.animateScrollBy
-import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
-import androidx.compose.foundation.lazy.layout.LazyLayoutSemanticState
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.ui.semantics.CollectionInfo
-import androidx.compose.ui.semantics.ScrollAxisRange
-
-@OptIn(ExperimentalFoundationApi::class)
-@Composable
-internal fun rememberLazyListSemanticState(
-    state: LazyListState,
-    itemProvider: LazyLayoutItemProvider,
-    reverseScrolling: Boolean,
-    isVertical: Boolean
-): LazyLayoutSemanticState =
-    remember(state, itemProvider, reverseScrolling, isVertical) {
-        object : LazyLayoutSemanticState {
-            override fun scrollAxisRange(): ScrollAxisRange =
-                ScrollAxisRange(
-                    value = {
-                        // This is a simple way of representing the current position without
-                        // needing any lazy items to be measured. It's good enough so far, because
-                        // screen-readers care mostly about whether scroll position changed or not
-                        // rather than the actual offset in pixels.
-                        state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
-                    },
-                    maxValue = {
-                        if (state.canScrollForward) {
-                            // If we can scroll further, we don't know the end yet,
-                            // but it's upper bounded by #items + 1
-                            itemProvider.itemCount + 1f
-                        } else {
-                            // If we can't scroll further, the current value is the max
-                            state.firstVisibleItemIndex +
-                                state.firstVisibleItemScrollOffset / 100_000f
-                        }
-                    },
-                    reverseScrolling = reverseScrolling
-                )
-
-            override suspend fun animateScrollBy(delta: Float) {
-                state.animateScrollBy(delta)
-            }
-
-            override suspend fun scrollToItem(index: Int) {
-                state.scrollToItem(index)
-            }
-
-            override fun collectionInfo(): CollectionInfo =
-                if (isVertical) {
-                    CollectionInfo(rowCount = -1, columnCount = 1)
-                } else {
-                    CollectionInfo(rowCount = 1, columnCount = -1)
-                }
-        }
-    }
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..502161e 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
@@ -77,7 +77,7 @@
 
     val itemProvider = rememberLazyGridItemProvider(state, content)
 
-    val semanticState = rememberLazyGridSemanticState(state, itemProvider, reverseLayout)
+    val semanticState = rememberLazyGridSemanticState(state, reverseLayout)
 
     val scope = rememberCoroutineScope()
     val placementAnimator = remember(state, isVertical) {
@@ -110,7 +110,8 @@
                 itemProvider = itemProvider,
                 state = semanticState,
                 orientation = orientation,
-                userScrollEnabled = userScrollEnabled
+                userScrollEnabled = userScrollEnabled,
+                reverseScrolling = reverseLayout
             )
             .clipScrollableContainer(orientation)
             .overscroll(overscrollEffect)
@@ -328,6 +329,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/grid/LazySemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
index 2e6d308..1f9c542 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazySemantics.kt
@@ -18,45 +18,23 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.gestures.animateScrollBy
-import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
 import androidx.compose.foundation.lazy.layout.LazyLayoutSemanticState
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
 import androidx.compose.ui.semantics.CollectionInfo
-import androidx.compose.ui.semantics.ScrollAxisRange
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 internal fun rememberLazyGridSemanticState(
     state: LazyGridState,
-    itemProvider: LazyLayoutItemProvider,
     reverseScrolling: Boolean
 ): LazyLayoutSemanticState =
-    remember(state, itemProvider, reverseScrolling) {
+    remember(state, reverseScrolling) {
         object : LazyLayoutSemanticState {
-            override fun scrollAxisRange(): ScrollAxisRange =
-                ScrollAxisRange(
-                    value = {
-                        // This is a simple way of representing the current position without
-                        // needing any lazy items to be measured. It's good enough so far, because
-                        // screen-readers care mostly about whether scroll position changed or not
-                        // rather than the actual offset in pixels.
-                        state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
-                    },
-                    maxValue = {
-                        if (state.canScrollForward) {
-                            // If we can scroll further, we don't know the end yet,
-                            // but it's upper bounded by #items + 1
-                            itemProvider.itemCount + 1f
-                        } else {
-                            // If we can't scroll further, the current value is the max
-                            state.firstVisibleItemIndex +
-                                state.firstVisibleItemScrollOffset / 100_000f
-                        }
-                    },
-                    reverseScrolling = reverseScrolling
-                )
+            override val currentPosition: Float
+                get() = state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
+            override val canScrollForward: Boolean
+                get() = state.canScrollForward
 
             override suspend fun animateScrollBy(delta: Float) {
                 state.animateScrollBy(delta)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/BeyondBoundsState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/BeyondBoundsState.kt
new file mode 100644
index 0000000..3407f2c
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/BeyondBoundsState.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.lazy.layout
+
+internal interface BeyondBoundsState {
+
+    fun remeasure()
+
+    val itemCount: Int
+
+    val hasVisibleItems: Boolean
+
+    val firstVisibleIndex: Int
+
+    val lastVisibleIndex: Int
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
new file mode 100644
index 0000000..939fe3e
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
@@ -0,0 +1,151 @@
+/*
+ * 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.lazy.layout
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.lazy.LazyListBeyondBoundsInfo
+import androidx.compose.foundation.lazy.LazyListBeyondBoundsInfo.Interval
+import androidx.compose.ui.layout.BeyondBoundsLayout
+import androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Above
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.After
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Before
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Below
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Left
+import androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion.Right
+import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout
+import androidx.compose.ui.modifier.ModifierLocalProvider
+import androidx.compose.ui.modifier.ProvidableModifierLocal
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.LayoutDirection.Ltr
+import androidx.compose.ui.unit.LayoutDirection.Rtl
+
+internal class LazyLayoutBeyondBoundsModifierLocal(
+    private val state: BeyondBoundsState,
+    private val beyondBoundsInfo: LazyListBeyondBoundsInfo,
+    private val reverseLayout: Boolean,
+    private val layoutDirection: LayoutDirection,
+    private val orientation: Orientation
+) : ModifierLocalProvider<BeyondBoundsLayout?>, BeyondBoundsLayout {
+    override val key: ProvidableModifierLocal<BeyondBoundsLayout?>
+        get() = ModifierLocalBeyondBoundsLayout
+    override val value: BeyondBoundsLayout
+        get() = this
+    companion object {
+        private val emptyBeyondBoundsScope = object : BeyondBoundsScope {
+            override val hasMoreContent = false
+        }
+    }
+
+    override fun <T> layout(
+        direction: BeyondBoundsLayout.LayoutDirection,
+        block: BeyondBoundsScope.() -> T?
+    ): T? {
+        // If the lazy list is empty, or if it does not have any visible items (Which implies
+        // that there isn't space to add a single item), we don't attempt to layout any more items.
+        if (state.itemCount <= 0 || !state.hasVisibleItems) {
+            return block.invoke(emptyBeyondBoundsScope)
+        }
+
+        // We use a new interval each time because this function is re-entrant.
+        var interval = beyondBoundsInfo.addInterval(
+            state.firstVisibleIndex,
+            state.lastVisibleIndex
+        )
+
+        var found: T? = null
+        while (found == null && interval.hasMoreContent(direction)) {
+
+            // Add one extra beyond bounds item.
+            interval = addNextInterval(interval, direction).also {
+                beyondBoundsInfo.removeInterval(interval)
+            }
+            state.remeasure()
+
+            // When we invoke this block, the beyond bounds items are present.
+            found = block.invoke(
+                object : BeyondBoundsScope {
+                    override val hasMoreContent: Boolean
+                        get() = interval.hasMoreContent(direction)
+                }
+            )
+        }
+
+        // Dispose the items that are beyond the visible bounds.
+        beyondBoundsInfo.removeInterval(interval)
+        state.remeasure()
+        return found
+    }
+
+    private fun addNextInterval(
+        currentInterval: Interval,
+        direction: BeyondBoundsLayout.LayoutDirection
+    ): Interval {
+        var start = currentInterval.start
+        var end = currentInterval.end
+        when (direction) {
+            Before -> start--
+            After -> end++
+            Above -> if (reverseLayout) end++ else start--
+            Below -> if (reverseLayout) start-- else end++
+            Left -> when (layoutDirection) {
+                Ltr -> if (reverseLayout) end++ else start--
+                Rtl -> if (reverseLayout) start-- else end++
+            }
+            Right -> when (layoutDirection) {
+                Ltr -> if (reverseLayout) start-- else end++
+                Rtl -> if (reverseLayout) end++ else start--
+            }
+            else -> unsupportedDirection()
+        }
+        return beyondBoundsInfo.addInterval(start, end)
+    }
+
+    private fun Interval.hasMoreContent(direction: BeyondBoundsLayout.LayoutDirection): Boolean {
+        fun hasMoreItemsBefore() = start > 0
+        fun hasMoreItemsAfter() = end < state.itemCount - 1
+        if (direction.isOppositeToOrientation()) return false
+        return when (direction) {
+            Before -> hasMoreItemsBefore()
+            After -> hasMoreItemsAfter()
+            Above -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
+            Below -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
+            Left -> when (layoutDirection) {
+                Ltr -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
+                Rtl -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
+            }
+            Right -> when (layoutDirection) {
+                Ltr -> if (reverseLayout) hasMoreItemsBefore() else hasMoreItemsAfter()
+                Rtl -> if (reverseLayout) hasMoreItemsAfter() else hasMoreItemsBefore()
+            }
+            else -> unsupportedDirection()
+        }
+    }
+
+    private fun BeyondBoundsLayout.LayoutDirection.isOppositeToOrientation(): Boolean {
+        return when (this) {
+            Above, Below -> orientation == Orientation.Horizontal
+            Left, Right -> orientation == Orientation.Vertical
+            Before, After -> false
+            else -> unsupportedDirection()
+        }
+    }
+}
+
+private fun unsupportedDirection(): Nothing = error(
+    "Lazy list does not support beyond bounds layout for the specified direction"
+)
\ No newline at end of file
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/layout/LazyLayoutSemanticState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemanticState.kt
new file mode 100644
index 0000000..c4e0403
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemanticState.kt
@@ -0,0 +1,47 @@
+/*
+ * 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.lazy.layout
+
+import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.ui.semantics.CollectionInfo
+
+internal fun LazyLayoutSemanticState(
+    state: LazyListState,
+    isVertical: Boolean
+): LazyLayoutSemanticState = object : LazyLayoutSemanticState {
+
+    override val currentPosition: Float
+        get() = state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
+    override val canScrollForward: Boolean
+        get() = state.canScrollForward
+
+    override suspend fun animateScrollBy(delta: Float) {
+        state.animateScrollBy(delta)
+    }
+
+    override suspend fun scrollToItem(index: Int) {
+        state.scrollToItem(index)
+    }
+
+    override fun collectionInfo(): CollectionInfo =
+        if (isVertical) {
+            CollectionInfo(rowCount = -1, columnCount = 1)
+        } else {
+            CollectionInfo(rowCount = 1, columnCount = -1)
+        }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
index c5e286b..1e56270 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
@@ -41,7 +41,8 @@
     itemProvider: LazyLayoutItemProvider,
     state: LazyLayoutSemanticState,
     orientation: Orientation,
-    userScrollEnabled: Boolean
+    userScrollEnabled: Boolean,
+    reverseScrolling: Boolean
 ): Modifier {
     val coroutineScope = rememberCoroutineScope()
     return this.then(
@@ -63,7 +64,26 @@
                 result
             }
 
-            val accessibilityScrollState = state.scrollAxisRange()
+            val accessibilityScrollState = ScrollAxisRange(
+                value = {
+                    // This is a simple way of representing the current position without
+                    // needing any lazy items to be measured. It's good enough so far, because
+                    // screen-readers care mostly about whether scroll position changed or not
+                    // rather than the actual offset in pixels.
+                    state.currentPosition
+                },
+                maxValue = {
+                    if (state.canScrollForward) {
+                        // If we can scroll further, we don't know the end yet,
+                        // but it's upper bounded by #items + 1
+                        itemProvider.itemCount + 1f
+                    } else {
+                        // If we can't scroll further, the current value is the max
+                        state.currentPosition
+                    }
+                },
+                reverseScrolling = reverseScrolling
+            )
 
             val scrollByAction: ((x: Float, y: Float) -> Boolean)? = if (userScrollEnabled) {
                 { x, y ->
@@ -123,7 +143,8 @@
 }
 
 internal interface LazyLayoutSemanticState {
-    fun scrollAxisRange(): ScrollAxisRange
+    val currentPosition: Float
+    val canScrollForward: Boolean
     fun collectionInfo(): CollectionInfo
     suspend fun animateScrollBy(delta: Float)
     suspend fun scrollToItem(index: Int)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
index 2630e7d..9525489 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGrid.kt
@@ -74,7 +74,7 @@
         horizontalArrangement,
         slotSizesSums
     )
-    val semanticState = rememberLazyStaggeredGridSemanticState(state, itemProvider, reverseLayout)
+    val semanticState = rememberLazyStaggeredGridSemanticState(state, reverseLayout)
 
     ScrollPositionUpdater(itemProvider, state)
 
@@ -100,7 +100,8 @@
                 itemProvider = itemProvider,
                 state = semanticState,
                 orientation = orientation,
-                userScrollEnabled = userScrollEnabled
+                userScrollEnabled = userScrollEnabled,
+                reverseScrolling = reverseLayout
             ),
         prefetchState = state.prefetchState,
         itemProvider = itemProvider,
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/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
index e9b7ca7..459702f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridSemantics.kt
@@ -18,44 +18,23 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.gestures.animateScrollBy
-import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
 import androidx.compose.foundation.lazy.layout.LazyLayoutSemanticState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.semantics.CollectionInfo
-import androidx.compose.ui.semantics.ScrollAxisRange
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 internal fun rememberLazyStaggeredGridSemanticState(
     state: LazyStaggeredGridState,
-    itemProvider: LazyLayoutItemProvider,
     reverseScrolling: Boolean
 ): LazyLayoutSemanticState =
-    remember(state, itemProvider, reverseScrolling) {
+    remember(state, reverseScrolling) {
         object : LazyLayoutSemanticState {
-            override fun scrollAxisRange(): ScrollAxisRange =
-                ScrollAxisRange(
-                    value = {
-                        // This is a simple way of representing the current position without
-                        // needing any lazy items to be measured. It's good enough so far, because
-                        // screen-readers care mostly about whether scroll position changed or not
-                        // rather than the actual offset in pixels.
-                        state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
-                    },
-                    maxValue = {
-                        if (state.canScrollForward) {
-                            // If we can scroll further, we don't know the end yet,
-                            // but it's upper bounded by #items + 1
-                            itemProvider.itemCount + 1f
-                        } else {
-                            // If we can't scroll further, the current value is the max
-                            state.firstVisibleItemIndex +
-                                state.firstVisibleItemScrollOffset / 100_000f
-                        }
-                    },
-                    reverseScrolling = reverseScrolling
-                )
+            override val currentPosition: Float
+                get() = state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
+            override val canScrollForward: Boolean
+                get() = state.canScrollForward
 
             override suspend fun animateScrollBy(delta: Float) {
                 state.animateScrollBy(delta)
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/SelectionAdjustment.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
index 3de82bb..968b74e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.foundation.text.selection
 
+import androidx.compose.foundation.text.findFollowingBreak
+import androidx.compose.foundation.text.findPrecedingBreak
 import androidx.compose.foundation.text.getParagraphBoundary
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
@@ -87,6 +89,7 @@
                     // If there isn't any selection before, we assume handles are not crossed.
                     val previousHandlesCrossed = previousSelectionRange?.reversed ?: false
                     ensureAtLeastOneChar(
+                        text = textLayoutResult.layoutInput.text.text,
                         offset = newRawSelectionRange.start,
                         lastOffset = textLayoutResult.layoutInput.text.lastIndex,
                         isStartHandle = isStartHandle,
@@ -205,6 +208,7 @@
                 // The new selection is collapsed, ensure at least one char is selected.
                 if (newRawSelectionRange.collapsed) {
                     return ensureAtLeastOneChar(
+                        text = textLayoutResult.layoutInput.text.text,
                         offset = newRawSelectionRange.start,
                         lastOffset = textLayoutResult.layoutInput.text.lastIndex,
                         isStartHandle = isStartHandle,
@@ -402,10 +406,12 @@
 }
 
 /**
- * This method adjusts the raw start and end offset and bounds the selection to one character. The
- * logic of bounding evaluates the last selection result, which handle is being dragged, and if
- * selection reaches the boundary.
+ * This method adjusts the raw start and end offset and bounds the selection to one character
+ * respecting [String.findPrecedingBreak] and [String.findFollowingBreak]. The logic of bounding
+ * evaluates the last selection result, which handle is being dragged, and if selection reaches the
+ * boundary.
  *
+ * @param text the complete string
  * @param offset unprocessed start and end offset calculated directly from input position, in
  * this case start and offset equals to each other.
  * @param lastOffset last offset of the text. It's actually the length of the text.
@@ -417,6 +423,7 @@
  * @return the adjusted [TextRange].
  */
 internal fun ensureAtLeastOneChar(
+    text: String,
     offset: Int,
     lastOffset: Int,
     isStartHandle: Boolean,
@@ -430,17 +437,17 @@
     // the other handle's position is computed accordingly.
     if (offset == 0) {
         return if (isStartHandle) {
-            TextRange(1, 0)
+            TextRange(text.findFollowingBreak(0), 0)
         } else {
-            TextRange(0, 1)
+            TextRange(0, text.findFollowingBreak(0))
         }
     }
 
     if (offset == lastOffset) {
         return if (isStartHandle) {
-            TextRange(lastOffset - 1, lastOffset)
+            TextRange(text.findPrecedingBreak(lastOffset), lastOffset)
         } else {
-            TextRange(lastOffset, lastOffset - 1)
+            TextRange(lastOffset, text.findPrecedingBreak(lastOffset))
         }
     }
 
@@ -449,18 +456,18 @@
     return if (isStartHandle) {
         if (!previousHandlesCrossed) {
             // Handle is NOT crossed, and the start handle is dragged.
-            TextRange(offset - 1, offset)
+            TextRange(text.findPrecedingBreak(offset), offset)
         } else {
             // Handle is crossed, and the start handle is dragged.
-            TextRange(offset + 1, offset)
+            TextRange(text.findFollowingBreak(offset), offset)
         }
     } else {
         if (!previousHandlesCrossed) {
             // Handle is NOT crossed, and the end handle is dragged.
-            TextRange(offset, offset + 1)
+            TextRange(offset, text.findFollowingBreak(offset))
         } else {
             // Handle is crossed, and the end handle is dragged.
-            TextRange(offset, offset - 1)
+            TextRange(offset, text.findPrecedingBreak(offset))
         }
     }
 }
\ No newline at end of file
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/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
index 1c52b7c..84211e52 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustmentTest.kt
@@ -111,6 +111,82 @@
     }
 
     @Test
+    fun adjustment_Character_collapsedNotReversed_returnOneUnicodeSelectionNotReversed() {
+        val textLayoutResult = mockTextLayoutResult(text = "hi\uD83D\uDE00")
+        // After the adjustment, the complete unicode should be selected instead of a single
+        // character that is only part of the unicode.
+        val rawSelection = TextRange(2, 2)
+        val previousSelection = TextRange(2, 4)
+        val isStartHandle = false
+
+        val adjustedSelection = SelectionAdjustment.Character.adjust(
+            textLayoutResult = textLayoutResult,
+            newRawSelectionRange = rawSelection,
+            previousHandleOffset = -1,
+            isStartHandle = isStartHandle,
+            previousSelectionRange = previousSelection
+        )
+
+        assertThat(adjustedSelection).isEqualTo(TextRange(2, 4))
+    }
+
+    @Test
+    fun adjustment_Character_collapsedReversed_returnOneUnicodeSelectionReversed() {
+        val textLayoutResult = mockTextLayoutResult(text = "hi\uD83D\uDE00")
+        val rawSelection = TextRange(4, 4)
+        val previousTextRange = TextRange(4, 2)
+        val isStartHandle = false
+
+        val adjustedTextRange = SelectionAdjustment.Character.adjust(
+            textLayoutResult = textLayoutResult,
+            newRawSelectionRange = rawSelection,
+            previousHandleOffset = -1,
+            isStartHandle = isStartHandle,
+            previousSelectionRange = previousTextRange
+        )
+
+        assertThat(adjustedTextRange).isEqualTo(TextRange(4, 2))
+    }
+
+    @Test
+    fun adjustment_Character_collapsedNotReversed_returnOneEmojiSelectionNotReversed() {
+        val textLayoutResult = mockTextLayoutResult(text = "#️⃣sharp")
+        // After the adjustment, the unicode sequence representing the keycap # emoji should be
+        // selected instead of a single character/unicode that is only part of the emoji.
+        val rawSelection = TextRange(0, 0)
+        val previousSelection = TextRange(0, 3)
+        val isStartHandle = false
+
+        val adjustedSelection = SelectionAdjustment.Character.adjust(
+            textLayoutResult = textLayoutResult,
+            newRawSelectionRange = rawSelection,
+            previousHandleOffset = -1,
+            isStartHandle = isStartHandle,
+            previousSelectionRange = previousSelection
+        )
+
+        assertThat(adjustedSelection).isEqualTo(TextRange(0, 3))
+    }
+
+    @Test
+    fun adjustment_Character_collapsedReversed_returnOneEmojiSelectionReversed() {
+        val textLayoutResult = mockTextLayoutResult(text = "#️⃣sharp")
+        val rawSelection = TextRange(3, 3)
+        val previousTextRange = TextRange(3, 0)
+        val isStartHandle = false
+
+        val adjustedTextRange = SelectionAdjustment.Character.adjust(
+            textLayoutResult = textLayoutResult,
+            newRawSelectionRange = rawSelection,
+            previousHandleOffset = -1,
+            isStartHandle = isStartHandle,
+            previousSelectionRange = previousTextRange
+        )
+
+        assertThat(adjustedTextRange).isEqualTo(TextRange(3, 0))
+    }
+
+    @Test
     fun adjustment_Word_collapsed() {
         val textLayoutResult = mockTextLayoutResult(
             text = "hello world",
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/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt
index 23f9a14..7cb8923 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt
@@ -125,6 +125,10 @@
  *      )
  *  )
  * ```
+ *
+ * This inspector only applies to Modifiers implemented prior to Modifier.Node. For the
+ * corresponding Modifier.Node inspection, see `ModifierNodeInspectablePropertiesDetector` in
+ * `:compose:ui:ui-lint`.
  */
 class ModifierInspectorInfoDetector : Detector(), SourceCodeScanner {
     override fun createUastHandler(context: JavaContext): UElementHandler = ModifierHandler(context)
diff --git a/compose/material/material-icons-core/api/1.4.0-beta02.txt b/compose/material/material-icons-core/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.4.0-beta02.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta02.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/res-1.4.0-beta02.txt b/compose/material/material-icons-core/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-icons-core/api/res-1.4.0-beta02.txt
diff --git a/compose/material/material-icons-core/api/restricted_1.4.0-beta02.txt b/compose/material/material-icons-core/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..619d449
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,1037 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-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
index 32f4093..6dba36f 100644
--- a/compose/material/material-ripple/api/1.4.0-beta01.txt
+++ b/compose/material/material-ripple/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/material/material-ripple/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/1.4.0-beta02.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.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
index 32f4093..6dba36f 100644
--- 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
@@ -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-beta02.txt b/compose/material/material-ripple/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/material/material-ripple/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-ripple/api/res-1.4.0-beta02.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
index 32f4093..6dba36f 100644
--- a/compose/material/material-ripple/api/restricted_1.4.0-beta01.txt
+++ b/compose/material/material-ripple/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/material/material-ripple/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.4.0-beta02.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.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
index 10fa729..a8f3f39 100644
--- a/compose/material/material/api/1.4.0-beta01.txt
+++ b/compose/material/material/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/material/material/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..a8f3f39
--- /dev/null
+++ b/compose/material/material/api/1.4.0-beta02.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
deleted file mode 100644
index 2bb29aa..0000000
--- a/compose/material/material/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedClass: androidx.compose.material.TouchTargetKt:
-    Removed class androidx.compose.material.TouchTargetKt
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
index b032320..9ae0deb 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/material/material/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..9ae0deb
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/material/material/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material/api/res-1.4.0-beta02.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
index 10fa729..a8f3f39 100644
--- a/compose/material/material/api/restricted_1.4.0-beta01.txt
+++ b/compose/material/material/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/material/material/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..a8f3f39
--- /dev/null
+++ b/compose/material/material/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index 2bb29aa..0000000
--- a/compose/material/material/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedClass: androidx.compose.material.TouchTargetKt:
-    Removed class androidx.compose.material.TouchTargetKt
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/build.gradle b/compose/material/material/build.gradle
index 53e8375..e2da821 100644
--- a/compose/material/material/build.gradle
+++ b/compose/material/material/build.gradle
@@ -21,6 +21,7 @@
     id("AndroidXPlugin")
     id("com.android.library")
     id("AndroidXComposePlugin")
+    id("AndroidXPaparazziPlugin")
 }
 
 AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project)
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/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
index 4d6e879..e75252f 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
@@ -117,7 +117,7 @@
         }
         rule.onNodeWithTag("card")
             .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")
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
index b9bdd17..bfb6224 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonTest.kt
@@ -34,6 +34,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.assertIsEnabled
 import androidx.compose.ui.test.assertWidthIsAtLeast
@@ -71,6 +75,7 @@
         }
 
         rule.onNodeWithTag("myButton")
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
             .assertIsEnabled()
     }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarHostTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
index 3c60de2..7918bcb 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SnackbarHostTest.kt
@@ -139,7 +139,8 @@
             Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
         }
 
-        rule.waitUntil(timeoutMillis = 7_000) { job2.isCompleted }
+        rule.mainClock.advanceTimeBy(5_000)
+        rule.waitUntil { job2.isCompleted }
     }
 
     @Test
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
index 99ffbe5..f288a88 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
@@ -218,7 +218,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")
@@ -364,7 +364,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")
@@ -468,7 +468,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/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/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
index 496ed96..b27bb71 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
@@ -48,6 +48,9 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.compositeOver
+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
 import kotlinx.coroutines.flow.collect
@@ -103,7 +106,7 @@
     val contentColor by colors.contentColor(enabled)
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         enabled = enabled,
         shape = shape,
         color = colors.backgroundColor(enabled).value,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
index 437d88d..d151712 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Chip.kt
@@ -99,7 +99,7 @@
     val contentColor by colors.contentColor(enabled)
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         enabled = enabled,
         shape = shape,
         color = colors.backgroundColor(enabled).value,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
index 6225e3a..8995a68 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/FloatingActionButton.kt
@@ -44,6 +44,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
 import kotlinx.coroutines.flow.collect
@@ -88,7 +91,7 @@
 ) {
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         shape = shape,
         color = backgroundColor,
         contentColor = contentColor,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
index 9aef3d8..895c713 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Surface.kt
@@ -178,9 +178,8 @@
  * that doesn't require [onClick] param.
  *
  * 7) 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].
  *
  * @sample androidx.compose.material.samples.ClickableSurfaceSample
  *
@@ -243,7 +242,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Button,
                     onClick = onClick
                 ),
             propagateMinConstraints = true
@@ -292,9 +290,8 @@
  * that doesn't require [onClick] param.
  *
  * 7) 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].
  *
  * @sample androidx.compose.material.samples.SelectableSurfaceSample
  *
@@ -360,7 +357,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Tab,
                     onClick = onClick
                 ),
             propagateMinConstraints = true
@@ -409,9 +405,8 @@
  * handling, consider using a Surface function that doesn't require [onCheckedChange] param.
  *
  * 7) 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].
  *
  * @sample androidx.compose.material.samples.ToggleableSurfaceSample
  *
@@ -477,7 +472,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Switch,
                     onValueChange = onCheckedChange
                 ),
             propagateMinConstraints = true
diff --git a/compose/material/material/src/test/kotlin/androidx/compose/material/ButtonPaparazziScreenshotTest.kt b/compose/material/material/src/test/kotlin/androidx/compose/material/ButtonPaparazziScreenshotTest.kt
new file mode 100644
index 0000000..8f6e548
--- /dev/null
+++ b/compose/material/material/src/test/kotlin/androidx/compose/material/ButtonPaparazziScreenshotTest.kt
@@ -0,0 +1,42 @@
+/*
+ * 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
+
+import androidx.testutils.paparazzi.androidxPaparazzi
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ButtonPaparazziScreenshotTest {
+    @get:Rule
+    val paparazzi = androidxPaparazzi()
+
+    @Test
+    fun default_button() {
+        paparazzi.snapshot {
+            MaterialTheme {
+                Surface {
+                    Button(onClick = { }) {
+                        Text("Button")
+                    }
+                }
+            }
+        }
+    }
+}
\ 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 3c04288..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,12 +317,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
-  public final class ElevationKt {
-  }
-
-  public final class ExposedDropdownMenuKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FabPosition {
     field public static final androidx.compose.material3.FabPosition.Companion Companion;
   }
@@ -432,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);
   }
@@ -483,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();
@@ -560,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();
@@ -634,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();
@@ -666,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 {
   }
 
@@ -762,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);
@@ -786,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 {
   }
 
@@ -809,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);
@@ -845,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);
@@ -864,9 +786,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
-  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();
@@ -883,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);
@@ -924,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 a9fd87e..22b8041 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 boolean showModeToggle, 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 {
   }
 
@@ -592,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();
@@ -662,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);
   }
@@ -901,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);
   }
@@ -1028,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);
@@ -1066,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 {
   }
 
@@ -1086,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);
@@ -1152,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);
@@ -1204,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);
   }
@@ -1317,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 3c04288..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,12 +317,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
-  public final class ElevationKt {
-  }
-
-  public final class ExposedDropdownMenuKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FabPosition {
     field public static final androidx.compose.material3.FabPosition.Companion Companion;
   }
@@ -432,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);
   }
@@ -483,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();
@@ -560,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();
@@ -634,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();
@@ -666,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 {
   }
 
@@ -762,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);
@@ -786,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 {
   }
 
@@ -809,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);
@@ -845,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);
@@ -864,9 +786,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
-  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();
@@ -883,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);
@@ -924,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..8ba8b89 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -16,13 +16,13 @@
 
 import androidx.build.AndroidXComposePlugin
 import androidx.build.LibraryType
-import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
     id("AndroidXComposePlugin")
+    id("AndroidXPaparazziPlugin")
 }
 
 AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project)
@@ -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 ae744c3..b2707cf 100644
--- a/compose/material3/material3/samples/build.gradle
+++ b/compose/material3/material3/samples/build.gradle
@@ -41,8 +41,6 @@
     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"))
 }
@@ -57,3 +55,11 @@
 android {
     namespace "androidx.compose.material3.samples"
 }
+
+// Workaround for https://github.com/gradle/gradle/issues/19882
+configurations.all {
+    resolutionStrategy.dependencySubstitution {
+        substitute(module("androidx.lifecycle:lifecycle-common-java8:")).
+                using project(":lifecycle:lifecycle-common-java8")
+    }
+}
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..3888e13 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,24 +19,35 @@
 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.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
+import androidx.compose.ui.zIndex
 import java.time.DayOfWeek
 import java.time.Instant
 import java.time.ZoneId
@@ -149,3 +160,45 @@
         Text("Entered date timestamp: ${state.selectedDateMillis ?: "no input"}")
     }
 }
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Preview
+@Sampled
+@Composable
+fun DateRangePickerSample() {
+    // Decoupled snackbar host state from scaffold state for demo purposes.
+    val snackState = remember { SnackbarHostState() }
+    val snackScope = rememberCoroutineScope()
+    SnackbarHost(hostState = snackState, Modifier.zIndex(1f))
+
+    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 = {
+                    snackScope.launch {
+                        snackState.showSnackbar(
+                            "Saved range (timestamps): " +
+                                "${state.selectedStartDateMillis!!..state.selectedEndDateMillis!!}"
+                        )
+                    }
+                },
+                enabled = state.selectedEndDateMillis != null
+            ) {
+                Text(text = "Save")
+            }
+        }
+
+        DateRangePicker(state = state, modifier = Modifier.weight(1f))
+    }
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
index a04f822..174afb1 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SearchBarSamples.kt
@@ -20,7 +20,6 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -30,7 +29,6 @@
 import androidx.compose.material.icons.filled.MoreVert
 import androidx.compose.material.icons.filled.Search
 import androidx.compose.material.icons.filled.Star
-import androidx.compose.material3.Divider
 import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
@@ -45,8 +43,11 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalFocusManager
+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
+import androidx.compose.ui.zIndex
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Preview
@@ -63,38 +64,41 @@
     }
 
     Box(Modifier.fillMaxSize()) {
-        // This is okay to put first because search bars by default have zIndex = 1f.
-        SearchBar(
-            modifier = Modifier.align(Alignment.TopCenter),
-            query = text,
-            onQueryChange = { text = it },
-            onSearch = { closeSearchBar() },
-            active = active,
-            onActiveChange = {
-                active = it
-                if (!active) focusManager.clearFocus()
-            },
-            placeholder = { Text("Hinted search text") },
-            leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
-            trailingIcon = { Icon(Icons.Default.MoreVert, contentDescription = null) },
-        ) {
-            Column(
-                modifier = Modifier.padding(16.dp).fillMaxWidth(),
-                verticalArrangement = Arrangement.spacedBy(4.dp)
+        // Talkback focus order sorts based on x and y position before considering z-index. The
+        // extra Box with fillMaxWidth is a workaround to get the search bar to focus before the
+        // content.
+        Box(Modifier.semantics { isContainer = true }.zIndex(1f).fillMaxWidth()) {
+            SearchBar(
+                modifier = Modifier.align(Alignment.TopCenter),
+                query = text,
+                onQueryChange = { text = it },
+                onSearch = { closeSearchBar() },
+                active = active,
+                onActiveChange = {
+                    active = it
+                    if (!active) focusManager.clearFocus()
+                },
+                placeholder = { Text("Hinted search text") },
+                leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
+                trailingIcon = { Icon(Icons.Default.MoreVert, contentDescription = null) },
             ) {
-                repeat(4) { idx ->
-                    val resultText = "Suggestion $idx"
-                    @OptIn(ExperimentalMaterial3Api::class)
-                    ListItem(
-                        headlineText = { Text(resultText) },
-                        supportingText = { Text("Additional info") },
-                        leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
-                        modifier = Modifier.clickable {
-                            text = resultText
-                            closeSearchBar()
-                        }
-                    )
-                    if (idx != 3) { Divider() }
+                LazyColumn(
+                    modifier = Modifier.fillMaxWidth(),
+                    contentPadding = PaddingValues(16.dp),
+                    verticalArrangement = Arrangement.spacedBy(4.dp)
+                ) {
+                    items(4) { idx ->
+                        val resultText = "Suggestion $idx"
+                        ListItem(
+                            headlineText = { Text(resultText) },
+                            supportingText = { Text("Additional info") },
+                            leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
+                            modifier = Modifier.clickable {
+                                text = resultText
+                                closeSearchBar()
+                            }
+                        )
+                    }
                 }
             }
         }
@@ -126,38 +130,41 @@
     }
 
     Box(Modifier.fillMaxSize()) {
-        // This is okay to put first because search bars by default have zIndex = 1f.
-        DockedSearchBar(
-            modifier = Modifier.align(Alignment.TopCenter).padding(top = 8.dp),
-            query = text,
-            onQueryChange = { text = it },
-            onSearch = { closeSearchBar() },
-            active = active,
-            onActiveChange = {
-                active = it
-                if (!active) focusManager.clearFocus()
-            },
-            placeholder = { Text("Hinted search text") },
-            leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
-            trailingIcon = { Icon(Icons.Default.MoreVert, contentDescription = null) },
-        ) {
-            Column(
-                modifier = Modifier.padding(16.dp).fillMaxWidth(),
-                verticalArrangement = Arrangement.spacedBy(4.dp)
+        // Talkback focus order sorts based on x and y position before considering z-index. The
+        // extra Box with fillMaxWidth is a workaround to get the search bar to focus before the
+        // content.
+        Box(Modifier.semantics { isContainer = true }.zIndex(1f).fillMaxWidth()) {
+            DockedSearchBar(
+                modifier = Modifier.align(Alignment.TopCenter).padding(top = 8.dp),
+                query = text,
+                onQueryChange = { text = it },
+                onSearch = { closeSearchBar() },
+                active = active,
+                onActiveChange = {
+                    active = it
+                    if (!active) focusManager.clearFocus()
+                },
+                placeholder = { Text("Hinted search text") },
+                leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
+                trailingIcon = { Icon(Icons.Default.MoreVert, contentDescription = null) },
             ) {
-                repeat(4) { idx ->
-                    val resultText = "Suggestion $idx"
-                    @OptIn(ExperimentalMaterial3Api::class)
-                    ListItem(
-                        headlineText = { Text(resultText) },
-                        supportingText = { Text("Additional info") },
-                        leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
-                        modifier = Modifier.clickable {
-                            text = resultText
-                            closeSearchBar()
-                        }
-                    )
-                    if (idx != 3) { Divider() }
+                LazyColumn(
+                    modifier = Modifier.fillMaxWidth(),
+                    contentPadding = PaddingValues(16.dp),
+                    verticalArrangement = Arrangement.spacedBy(4.dp)
+                ) {
+                    items(4) { idx ->
+                        val resultText = "Suggestion $idx"
+                        ListItem(
+                            headlineText = { Text(resultText) },
+                            supportingText = { Text("Additional info") },
+                            leadingContent = { Icon(Icons.Filled.Star, contentDescription = null) },
+                            modifier = Modifier.clickable {
+                                text = resultText
+                                closeSearchBar()
+                            }
+                        )
+                    }
                 }
             }
         }
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 ca6b7b4..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
@@ -16,7 +16,6 @@
 
 package androidx.compose.material3.samples
 
-import android.text.format.DateFormat
 import androidx.annotation.Sampled
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
@@ -42,11 +41,9 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Dialog
@@ -62,9 +59,7 @@
 @Preview
 fun TimePickerSample() {
     var showTimePicker by remember { mutableStateOf(false) }
-    val context = LocalContext.current
-    val is24HourFormat by rememberUpdatedState(DateFormat.is24HourFormat(context))
-    val state = rememberTimePickerState(is24Hour = is24HourFormat)
+    val state = rememberTimePickerState()
     val formatter = remember { SimpleDateFormat("hh:mm a", Locale.getDefault()) }
     val snackState = remember { SnackbarHostState() }
     val snackScope = rememberCoroutineScope()
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/DatePickerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DatePickerTest.kt
index 27760ff..0d32838 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DatePickerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DatePickerTest.kt
@@ -355,7 +355,7 @@
                 stateData.calendarModel.getCanonicalDate(1649721600000L) // 04/12/2022
             val displayedMonth = stateData.calendarModel.getMonth(date)
             rule.runOnIdle {
-                stateData.selectedStartDate = date
+                stateData.selectedStartDate.value = date
                 stateData.displayedMonth = displayedMonth
             }
 
@@ -364,7 +364,7 @@
             restorationTester.emulateSavedInstanceStateRestore()
 
             rule.runOnIdle {
-                assertThat(stateData.selectedStartDate).isEqualTo(date)
+                assertThat(stateData.selectedStartDate.value).isEqualTo(date)
                 assertThat(stateData.displayedMonth).isEqualTo(displayedMonth)
                 assertThat(datePickerState!!.selectedDateMillis).isEqualTo(1649721600000L)
             }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt
new file mode 100644
index 0000000..fc637de
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputScreenshotTest.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.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 DateRangeInputScreenshotTest(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 = "dateRangeInputWrapper"
+
+    @Test
+    fun dateRangeInput_initialState() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                DateRangePicker(
+                    state = rememberDateRangePickerState(initialDisplayMode = DisplayMode.Input),
+                    showModeToggle = false
+                )
+            }
+        }
+        assertAgainstGolden("dateRangeInput_initialState_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangeInput_withModeToggle() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                DateRangePicker(
+                    state = rememberDateRangePickerState(initialDisplayMode = DisplayMode.Input)
+                )
+            }
+        }
+        assertAgainstGolden("dateRangeInput_withModeToggle_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangeInput_withEnteredDates() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val startDayMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
+                val endDayMillis = dayInUtcMilliseconds(year = 2022, month = 1, dayOfMonth = 10)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialSelectedStartDateMillis = startDayMillis,
+                        initialSelectedEndDateMillis = endDayMillis,
+                        initialDisplayMode = DisplayMode.Input
+                    ),
+                    showModeToggle = false
+                )
+            }
+        }
+        assertAgainstGolden("dateRangeInput_withEnteredDates_${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
+        }
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt
new file mode 100644
index 0000000..aa623b5
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangeInputTest.kt
@@ -0,0 +1,267 @@
+/*
+ * 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 androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher.Companion.expectValue
+import androidx.compose.ui.test.SemanticsMatcher.Companion.keyIsDefined
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onAllNodesWithText
+import androidx.compose.ui.test.onFirst
+import androidx.compose.ui.test.onLast
+import androidx.compose.ui.test.onNodeWithContentDescription
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performTextInput
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import java.util.Calendar
+import java.util.Locale
+import java.util.TimeZone
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalMaterial3Api::class)
+class DateRangeInputTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun dateRangeInput() {
+        lateinit var dateRangeInputLabel: String
+        lateinit var state: DateRangePickerState
+        lateinit var pickerStartDateHeadline: String
+        lateinit var pickerEndDateHeadline: String
+        rule.setMaterialContent(lightColorScheme()) {
+            pickerStartDateHeadline = getString(string = Strings.DateRangePickerStartHeadline)
+            pickerEndDateHeadline = getString(string = Strings.DateRangePickerEndHeadline)
+            dateRangeInputLabel = getString(string = Strings.DateInputLabel)
+            val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
+            state = rememberDateRangePickerState(
+                initialDisplayedMonthMillis = monthInUtcMillis,
+                initialDisplayMode = DisplayMode.Input
+            )
+            DateRangePicker(state = state)
+        }
+
+        rule.onNodeWithText(pickerStartDateHeadline, useUnmergedTree = true).assertExists()
+        rule.onNodeWithText(pickerEndDateHeadline, useUnmergedTree = true).assertExists()
+
+        // Enter dates.
+        rule.onAllNodesWithText(dateRangeInputLabel).onFirst().performClick()
+            .performTextInput("01272019")
+        rule.onAllNodesWithText(dateRangeInputLabel).onLast().performClick()
+            .performTextInput("05102020")
+
+        rule.runOnIdle {
+            assertThat(state.selectedStartDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2019,
+                    month = 1,
+                    dayOfMonth = 27
+                )
+            )
+            assertThat(state.selectedEndDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2020,
+                    month = 5,
+                    dayOfMonth = 10
+                )
+            )
+        }
+
+        rule.onNodeWithText(pickerStartDateHeadline, useUnmergedTree = true).assertDoesNotExist()
+        rule.onNodeWithText(pickerEndDateHeadline, useUnmergedTree = true).assertDoesNotExist()
+        rule.onNodeWithText("Jan 27, 2019", useUnmergedTree = true).assertExists()
+        rule.onNodeWithText("May 10, 2020", useUnmergedTree = true).assertExists()
+    }
+
+    @Test
+    fun dateRangeInputWithInitialDates() {
+        lateinit var state: DateRangePickerState
+        rule.setMaterialContent(lightColorScheme()) {
+            val initialStartDateMillis =
+                dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 11)
+            val initialEndDateMillis =
+                dayInUtcMilliseconds(year = 2020, month = 10, dayOfMonth = 20)
+            state = rememberDateRangePickerState(
+                initialSelectedStartDateMillis = initialStartDateMillis,
+                initialSelectedEndDateMillis = initialEndDateMillis,
+                initialDisplayMode = DisplayMode.Input
+            )
+            DateRangePicker(state = state)
+        }
+
+        rule.onNodeWithText("05/11/2010").assertExists()
+        rule.onNodeWithText("10/20/2020").assertExists()
+        rule.onNodeWithText("May 11, 2010", useUnmergedTree = true).assertExists()
+        rule.onNodeWithText("Oct 20, 2020", useUnmergedTree = true).assertExists()
+    }
+
+    @Test
+    fun inputDateNotAllowed() {
+        lateinit var dateRangeInputLabel: String
+        lateinit var errorMessage: String
+        lateinit var state: DateRangePickerState
+        rule.setMaterialContent(lightColorScheme()) {
+            dateRangeInputLabel = getString(string = Strings.DateInputLabel)
+            errorMessage = getString(string = Strings.DateInputInvalidNotAllowed)
+            state = rememberDateRangePickerState(initialDisplayMode = DisplayMode.Input)
+            DateRangePicker(state = state,
+                // All dates are invalid for the sake of this test.
+                dateValidator = { false }
+            )
+        }
+
+        // Enter dates.
+        rule.onAllNodesWithText(dateRangeInputLabel).onFirst().performClick()
+            .performTextInput("01272019")
+        rule.onAllNodesWithText(dateRangeInputLabel).onLast().performClick()
+            .performTextInput("05102020")
+
+        rule.runOnIdle {
+            assertThat(state.selectedStartDateMillis).isNull()
+            assertThat(state.selectedEndDateMillis).isNull()
+        }
+        rule.onNodeWithText("01/27/2019")
+            .assert(keyIsDefined(SemanticsProperties.Error))
+            .assert(
+                expectValue(
+                    SemanticsProperties.Error,
+                    errorMessage.format("Jan 27, 2019")
+                )
+            )
+        rule.onNodeWithText("05/10/2020")
+            .assert(keyIsDefined(SemanticsProperties.Error))
+            .assert(
+                expectValue(
+                    SemanticsProperties.Error,
+                    errorMessage.format("May 10, 2020")
+                )
+            )
+    }
+
+    @Test
+    fun outOfOrderDateRange() {
+        lateinit var dateRangeInputLabel: String
+        lateinit var errorMessage: String
+        lateinit var state: DateRangePickerState
+        rule.setMaterialContent(lightColorScheme()) {
+            dateRangeInputLabel = getString(string = Strings.DateInputLabel)
+            errorMessage = getString(string = Strings.DateRangeInputInvalidRangeInput)
+            state = rememberDateRangePickerState(
+                // Limit the years selection to 2018-2023
+                yearRange = IntRange(2018, 2023),
+                initialDisplayMode = DisplayMode.Input
+            )
+            DateRangePicker(state = state)
+        }
+
+        // Enter dates where the start date is later than the end date.
+        rule.onAllNodesWithText(dateRangeInputLabel).onFirst().performClick()
+            .performTextInput("01272020")
+        rule.onAllNodesWithText(dateRangeInputLabel).onLast().performClick()
+            .performTextInput("05102019")
+
+        rule.runOnIdle {
+            // Expecting the first stored date to still be valid, and the second one to be null.
+            assertThat(state.selectedStartDateMillis).isNotNull()
+            assertThat(state.selectedEndDateMillis).isNull()
+        }
+        rule.onNodeWithText("05/10/2019")
+            .assert(keyIsDefined(SemanticsProperties.Error))
+            .assert(expectValue(SemanticsProperties.Error, errorMessage))
+    }
+
+    @Test
+    fun switchToDateRangePicker() {
+        lateinit var switchToPickerDescription: String
+        lateinit var dateRangeInputLabel: String
+        lateinit var pickerStartDateHeadline: String
+        lateinit var pickerEndDateHeadline: String
+        rule.setMaterialContent(lightColorScheme()) {
+            switchToPickerDescription = getString(string = Strings.DatePickerSwitchToCalendarMode)
+            dateRangeInputLabel = getString(string = Strings.DateInputLabel)
+            pickerStartDateHeadline = getString(string = Strings.DateRangePickerStartHeadline)
+            pickerEndDateHeadline = getString(string = Strings.DateRangePickerEndHeadline)
+            DateRangePicker(
+                state = rememberDateRangePickerState(initialDisplayMode = DisplayMode.Input)
+            )
+        }
+
+        // Click to switch to DateRangePicker.
+        rule.onNodeWithContentDescription(label = switchToPickerDescription).performClick()
+
+        rule.waitForIdle()
+        rule.onNodeWithText(pickerStartDateHeadline, useUnmergedTree = true).assertIsDisplayed()
+        rule.onNodeWithText(pickerEndDateHeadline, useUnmergedTree = true).assertIsDisplayed()
+        rule.onNodeWithText(dateRangeInputLabel).assertDoesNotExist()
+    }
+
+    @Test
+    fun defaultSemantics() {
+        val startDateMillis = dayInUtcMilliseconds(year = 2010, month = 5, dayOfMonth = 11)
+        val endDateMillis = dayInUtcMilliseconds(year = 2010, month = 6, dayOfMonth = 12)
+        lateinit var pickerStartDateHeadline: String
+        lateinit var pickerEndDateHeadline: String
+        rule.setMaterialContent(lightColorScheme()) {
+            pickerStartDateHeadline = getString(string = Strings.DateRangePickerStartHeadline)
+            pickerEndDateHeadline = getString(string = Strings.DateRangePickerEndHeadline)
+            DateRangePicker(
+                state = rememberDateRangePickerState(
+                    initialSelectedStartDateMillis = startDateMillis,
+                    initialSelectedEndDateMillis = endDateMillis,
+                    initialDisplayMode = DisplayMode.Input
+                )
+            )
+        }
+
+        val fullStartDateDescription = formatWithSkeleton(
+            startDateMillis,
+            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+            Locale.US
+        )
+        val fullEndDateDescription = formatWithSkeleton(
+            endDateMillis,
+            DatePickerDefaults.YearMonthWeekdayDaySkeleton,
+            Locale.US
+        )
+
+        val startHeadlineDescription = "$pickerStartDateHeadline: $fullStartDateDescription"
+        val endHeadlineDescription = "$pickerEndDateHeadline: $fullEndDateDescription"
+        rule.onNodeWithContentDescription("$startHeadlineDescription, $endHeadlineDescription")
+            .assertExists()
+    }
+
+    // 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 {
+        val firstDayCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
+        firstDayCalendar.clear()
+        firstDayCalendar[Calendar.YEAR] = year
+        firstDayCalendar[Calendar.MONTH] = month - 1
+        firstDayCalendar[Calendar.DAY_OF_MONTH] = dayOfMonth
+        return firstDayCalendar.timeInMillis
+    }
+}
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..2e96eb2
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
@@ -0,0 +1,187 @@
+/*
+ * 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
+                    ),
+                    showModeToggle = false
+                )
+            }
+        }
+        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
+                    ),
+                    showModeToggle = false
+                )
+            }
+        }
+        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
+                    ),
+                    showModeToggle = false
+                )
+            }
+        }
+        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
+                    },
+                    showModeToggle = false
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_invalidSundaySelection_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangePicker_withModeToggle() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis
+                    )
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_withModeToggle_${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..feecc3a 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
@@ -188,8 +302,8 @@
                 stateData.calendarModel.getCanonicalDate(1649721600000L + MillisecondsIn24Hours)
             val displayedMonth = stateData.calendarModel.getMonth(startDate)
             rule.runOnIdle {
-                stateData.selectedStartDate = startDate
-                stateData.selectedEndDate = endDate
+                stateData.selectedStartDate.value = startDate
+                stateData.selectedEndDate.value = endDate
                 stateData.displayedMonth = displayedMonth
             }
 
@@ -198,8 +312,8 @@
             restorationTester.emulateSavedInstanceStateRestore()
 
             rule.runOnIdle {
-                assertThat(stateData.selectedStartDate).isEqualTo(startDate)
-                assertThat(stateData.selectedEndDate).isEqualTo(endDate)
+                assertThat(stateData.selectedStartDate.value).isEqualTo(startDate)
+                assertThat(stateData.selectedEndDate.value).isEqualTo(endDate)
                 assertThat(stateData.displayedMonth).isEqualTo(displayedMonth)
                 assertThat(dateRangePickerState!!.selectedStartDateMillis)
                     .isEqualTo(1649721600000L)
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/OutlinedTextFieldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
index 6dbc6fc..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
@@ -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/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..14e22c4 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
@@ -139,7 +141,8 @@
             Truth.assertThat(result).isEqualTo(SnackbarResult.Dismissed)
         }
 
-        rule.waitUntil(timeoutMillis = 10_000) { job2.isCompleted }
+        rule.mainClock.advanceTimeBy(5_000)
+        rule.waitUntil { job2.isCompleted }
     }
 
     @Test
@@ -192,6 +195,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/TabTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
index ed385e3..47dd16b 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
@@ -17,8 +17,10 @@
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
@@ -630,7 +632,7 @@
     }
 
     @Test
-    fun LeadingIconTabRow_selectNewTab() {
+    fun leadingIconTabRow_selectNewTab() {
         rule
             .setMaterialContent(lightColorScheme()) {
                 LeadingIconTabs()
@@ -745,7 +747,8 @@
 
             val indicator = @Composable { tabPositions: List<TabPosition> ->
                 TabRowDefaults.Indicator(
-                    Modifier.tabIndicatorOffset(tabPositions[state])
+                    Modifier
+                        .tabIndicatorOffset(tabPositions[state])
                         .testTag("indicator")
                 )
             }
@@ -866,4 +869,68 @@
             }
             .assertHeightIsAtLeast(100.dp)
     }
+
+    @Test
+    fun tabRow_layoutHeightRespected() {
+        var height by mutableStateOf(0.dp)
+        rule
+            .setMaterialContent(lightColorScheme()) {
+                var state by remember { mutableStateOf(0) }
+                val titles = listOf("Tab 1", "Tab 2", "Tab 3")
+                Column(
+                    Modifier
+                        .heightIn(max = height)
+                        .testTag("Tabs")
+                ) {
+                    TabRow(selectedTabIndex = state) {
+                        titles.forEachIndexed { index, title ->
+                            Tab(
+                                selected = state == index,
+                                onClick = { state = index },
+                                text = { Text(text = title) }
+                            )
+                        }
+                    }
+                }
+            }
+
+        rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
+
+        height = 40.dp
+        rule.waitForIdle()
+
+        rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
+    }
+
+    @Test
+    fun scrollableTabRow_layoutHeightRespected() {
+        var height by mutableStateOf(0.dp)
+        rule
+            .setMaterialContent(lightColorScheme()) {
+                var state by remember { mutableStateOf(0) }
+                val titles = listOf("Tab 1", "Tab 2", "Tab 3")
+                Column(
+                    Modifier
+                        .heightIn(max = height)
+                        .testTag("Tabs")
+                ) {
+                    ScrollableTabRow(selectedTabIndex = state) {
+                        titles.forEachIndexed { index, title ->
+                            Tab(
+                                selected = state == index,
+                                onClick = { state = index },
+                                text = { Text(text = title) }
+                            )
+                        }
+                    }
+                }
+            }
+
+        rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
+
+        height = 40.dp
+        rule.waitForIdle()
+
+        rule.onNodeWithTag("Tabs").assertHeightIsEqualTo(height)
+    }
 }
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 c3818c3e..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)
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 d9a9edd..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,6 +16,10 @@
 
 package androidx.compose.material3
 
+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
@@ -45,14 +49,20 @@
 import androidx.compose.ui.test.performTouchInput
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+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
@@ -141,6 +151,60 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun timePickerState_format_12h() {
+        lateinit var context: Context
+        lateinit var state: TimePickerState
+        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
+        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()
+    }
+
+    @Test
     fun timePicker_toggle_semantics() {
         val state = TimePickerState(initialHour = 14, initialMinute = 23, is24Hour = false)
         lateinit var contentDescription: String
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
index eafc433..bbffc0f5 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipScreenshotTest.kt
@@ -17,20 +17,22 @@
 package androidx.compose.material3
 
 import android.os.Build
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.longClick
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
-import kotlinx.coroutines.launch
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -48,44 +50,98 @@
 
     @Test
     fun plainTooltip_lightTheme() {
-        rule.setMaterialContent(lightColorScheme()) { TestPlainTooltips() }
+        rule.setMaterialContent(lightColorScheme()) { PlainTooltipTest() }
+
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        // Advance by the fade in time
+        rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
+
+        rule.waitForIdle()
         assertAgainstGolden("plainTooltip_lightTheme")
     }
 
     @Test
     fun plainTooltip_darkTheme() {
-        rule.setMaterialContent(darkColorScheme()) { TestPlainTooltips() }
+        rule.setMaterialContent(darkColorScheme()) { PlainTooltipTest() }
+
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        // Advance by the fade in time
+        rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
+
+        rule.waitForIdle()
         assertAgainstGolden("plainTooltip_darkTheme")
     }
 
     @Test
     fun richTooltip_lightTheme() {
-        rule.setMaterialContent(lightColorScheme()) { TestRichTooltips() }
+        rule.setMaterialContent(lightColorScheme()) { RichTooltipTest() }
+
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        // Advance by the fade in time
+        rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
+
+        rule.waitForIdle()
         assertAgainstGolden("richTooltip_lightTheme")
     }
 
     @Test
     fun richTooltip_darkTheme() {
-        rule.setMaterialContent(darkColorScheme()) { TestRichTooltips() }
+        rule.setMaterialContent(darkColorScheme()) { RichTooltipTest() }
+
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        // Advance by the fade in time
+        rule.mainClock.advanceTimeBy(TooltipFadeInDuration.toLong())
+
+        rule.waitForIdle()
         assertAgainstGolden("richTooltip_darkTheme")
     }
 
+    private fun assertAgainstGolden(goldenName: String) {
+        rule.onNodeWithTag(TooltipTestTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenName)
+    }
+
     @Composable
-    private fun TestPlainTooltips() {
-        val scope = rememberCoroutineScope()
+    private fun PlainTooltipTest() {
         val tooltipState = remember { PlainTooltipState() }
         PlainTooltipBox(
             tooltip = { Text("Tooltip Text") },
             modifier = Modifier.testTag(TooltipTestTag),
             tooltipState = tooltipState
-        ) {}
-
-        scope.launch { tooltipState.show() }
+        ) {
+            Icon(
+                Icons.Filled.Favorite,
+                contentDescription = null,
+                modifier = Modifier
+                    .testTag(AnchorTestTag)
+                    .tooltipAnchor()
+            )
+        }
     }
 
     @Composable
-    private fun TestRichTooltips() {
-        val scope = rememberCoroutineScope()
+    private fun RichTooltipTest() {
         val tooltipState = remember { RichTooltipState() }
         RichTooltipBox(
             title = { Text("Title") },
@@ -98,16 +154,17 @@
             action = { Text("Action Text") },
             tooltipState = tooltipState,
             modifier = Modifier.testTag(TooltipTestTag)
-        ) {}
-
-        scope.launch { tooltipState.show() }
-    }
-
-    private fun assertAgainstGolden(goldenName: String) {
-        rule.onNodeWithTag(TooltipTestTag)
-            .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenName)
+        ) {
+            Icon(
+                Icons.Filled.Favorite,
+                contentDescription = null,
+                modifier = Modifier
+                    .testTag(AnchorTestTag)
+                    .tooltipAnchor()
+            )
+        }
     }
 }
 
+private const val AnchorTestTag = "Anchor"
 private const val TooltipTestTag = "tooltip"
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipTest.kt
index 666507d..a25e85f 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TooltipTest.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.material3
 
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.combinedClickable
 import androidx.compose.foundation.layout.size
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
@@ -56,8 +54,15 @@
 
     @Test
     fun plainTooltip_noContent_size() {
-        rule.setMaterialContent(lightColorScheme()) { TestPlainTooltip() }
+        rule.setMaterialContent(lightColorScheme()) { PlainTooltipTest() }
 
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         rule.onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(TooltipMinHeight)
             .assertWidthIsEqualTo(TooltipMinWidth)
@@ -65,7 +70,15 @@
 
     @Test
     fun richTooltip_noContent_size() {
-        rule.setMaterialContent(lightColorScheme()) { TestRichTooltip() }
+        rule.setMaterialContent(lightColorScheme()) { RichTooltipTest() }
+
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         rule.onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(TooltipMinHeight)
             .assertWidthIsEqualTo(TooltipMinWidth)
@@ -75,11 +88,19 @@
     fun plainTooltip_customSize_size() {
         val customWidth = 100.dp
         val customHeight = 100.dp
-
         rule.setMaterialContent(lightColorScheme()) {
-            TestPlainTooltip(modifier = Modifier.size(customWidth, customHeight))
+            PlainTooltipTest(
+                modifier = Modifier.size(customWidth, customHeight)
+            )
         }
 
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         rule.onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
@@ -89,11 +110,19 @@
     fun richTooltip_customSize_size() {
         val customWidth = 100.dp
         val customHeight = 100.dp
-
         rule.setMaterialContent(lightColorScheme()) {
-            TestRichTooltip(modifier = Modifier.size(customWidth, customHeight))
+            RichTooltipTest(
+                modifier = Modifier.size(customWidth, customHeight)
+            )
         }
 
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         rule.onNodeWithTag(ContainerTestTag)
             .assertHeightIsEqualTo(customHeight)
             .assertWidthIsEqualTo(customWidth)
@@ -103,7 +132,7 @@
     @Test
     fun plainTooltip_content_padding() {
         rule.setMaterialContent(lightColorScheme()) {
-            TestPlainTooltip(
+            PlainTooltipTest(
                 tooltipContent = {
                     Text(
                         text = "Test",
@@ -113,6 +142,13 @@
             )
         }
 
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         rule.onNodeWithTag(TextTestTag)
             .assertLeftPositionInRootIsEqualTo(8.dp)
             .assertTopPositionInRootIsEqualTo(4.dp)
@@ -121,13 +157,20 @@
     @Test
     fun richTooltip_content_padding() {
         rule.setMaterialContent(lightColorScheme()) {
-            TestRichTooltip(
+            RichTooltipTest(
                 title = { Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag)) },
                 text = { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) },
-                action = { Text(text = "Action", modifier = Modifier.testTag(ActionTestTag)) },
+                action = { Text(text = "Action", modifier = Modifier.testTag(ActionTestTag)) }
             )
         }
 
+        // Stop auto advance for test consistency
+        rule.mainClock.autoAdvance = false
+
+        rule.onNodeWithTag(AnchorTestTag)
+            .performTouchInput { longClick() }
+
+        rule.waitForIdle()
         val subhead = rule.onNodeWithTag(SubheadTestTag)
         val text = rule.onNodeWithTag(TextTestTag)
 
@@ -154,19 +197,18 @@
     fun plainTooltip_behavior() {
         val tooltipState = PlainTooltipState()
         rule.setMaterialContent(lightColorScheme()) {
-            PlainTooltipBox(
-                tooltip = { Text(text = "Test", modifier = Modifier.testTag(TextTestTag)) },
-                tooltipState = tooltipState,
-                modifier = Modifier.testTag(ContainerTestTag)
-            ) { Anchor(tooltipState) }
+            PlainTooltipTest(
+                tooltipContent = { Text(text = "Test", modifier = Modifier.testTag(TextTestTag)) },
+                tooltipState = tooltipState
+            )
         }
 
-        // Tooltip should initially be not visible
-        assertThat(tooltipState.isVisible).isFalse()
-
         // Test will manually advance the time to check the timeout
         rule.mainClock.autoAdvance = false
 
+        // Tooltip should initially be not visible
+        assertThat(tooltipState.isVisible).isFalse()
+
         // Long press the icon
         rule.onNodeWithTag(AnchorTestTag)
             .performTouchInput { longClick() }
@@ -185,20 +227,19 @@
     fun richTooltip_behavior_noAction() {
         val tooltipState = RichTooltipState()
         rule.setMaterialContent(lightColorScheme()) {
-            RichTooltipBox(
+            RichTooltipTest(
                 title = { Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag)) },
                 text = { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) },
-                tooltipState = tooltipState,
-                modifier = Modifier.testTag(ContainerTestTag)
-            ) { Anchor(tooltipState) }
+                tooltipState = tooltipState
+            )
         }
 
-        // Tooltip should initially be not visible
-        assertThat(tooltipState.isVisible).isFalse()
-
         // Test will manually advance the time to check the timeout
         rule.mainClock.autoAdvance = false
 
+        // Tooltip should initially be not visible
+        assertThat(tooltipState.isVisible).isFalse()
+
         // Long press the icon
         rule.onNodeWithTag(AnchorTestTag)
             .performTouchInput { longClick() }
@@ -218,7 +259,7 @@
         val tooltipState = RichTooltipState()
         rule.setMaterialContent(lightColorScheme()) {
             val scope = rememberCoroutineScope()
-            RichTooltipBox(
+            RichTooltipTest(
                 title = { Text(text = "Subhead", modifier = Modifier.testTag(SubheadTestTag)) },
                 text = { Text(text = "Text", modifier = Modifier.testTag(TextTestTag)) },
                 action = {
@@ -227,17 +268,16 @@
                         modifier = Modifier.testTag(ActionTestTag)
                     ) { Text(text = "Action") }
                 },
-                tooltipState = tooltipState,
-                modifier = Modifier.testTag(ContainerTestTag)
-            ) { Anchor(tooltipState) }
+                tooltipState = tooltipState
+            )
         }
 
-        // Tooltip should initially be not visible
-        assertThat(tooltipState.isVisible).isFalse()
-
         // Test will manually advance the time to check the timeout
         rule.mainClock.autoAdvance = false
 
+        // Tooltip should initially be not visible
+        assertThat(tooltipState.isVisible).isFalse()
+
         // Long press the icon
         rule.onNodeWithTag(AnchorTestTag)
             .performTouchInput { longClick() }
@@ -258,64 +298,49 @@
     }
 
     @Composable
-    private fun TestPlainTooltip(
+    private fun PlainTooltipTest(
         modifier: Modifier = Modifier,
+        tooltipContent: @Composable () -> Unit = {},
         tooltipState: PlainTooltipState = remember { PlainTooltipState() },
-        tooltipContent: @Composable () -> Unit = {}
     ) {
-        val scope = rememberCoroutineScope()
-
         PlainTooltipBox(
             tooltip = tooltipContent,
-            modifier = modifier.testTag(ContainerTestTag),
-            tooltipState = tooltipState
-        ) {}
-
-        scope.launch { tooltipState.show() }
+            tooltipState = tooltipState,
+            modifier = modifier.testTag(ContainerTestTag)
+        ) {
+            Icon(
+                Icons.Filled.Favorite,
+                contentDescription = null,
+                modifier = Modifier
+                    .testTag(AnchorTestTag)
+                    .tooltipAnchor()
+            )
+        }
     }
 
     @Composable
-    private fun TestRichTooltip(
+    private fun RichTooltipTest(
         modifier: Modifier = Modifier,
         tooltipState: RichTooltipState = remember { RichTooltipState() },
         text: @Composable () -> Unit = {},
-        action: (@Composable () -> Unit)? = null,
-        title: (@Composable () -> Unit)? = null
+        title: (@Composable () -> Unit)? = null,
+        action: (@Composable () -> Unit)? = null
     ) {
-        val scope = rememberCoroutineScope()
-
         RichTooltipBox(
             text = text,
-            action = action,
             title = title,
-            modifier = modifier.testTag(ContainerTestTag),
-            tooltipState = tooltipState
-        ) {}
-
-        scope.launch { tooltipState.show() }
-    }
-
-    @OptIn(ExperimentalFoundationApi::class)
-    @Composable
-    private fun Anchor(
-        tooltipState: TooltipState
-    ) {
-        val scope = rememberCoroutineScope()
-
-        Icon(
-            Icons.Filled.Favorite,
-            contentDescription = null,
-            modifier = Modifier
-                .testTag(AnchorTestTag)
-                .combinedClickable(
-                    onClick = {},
-                    onLongClick = {
-                        scope.launch {
-                            tooltipState.show()
-                        }
-                    }
-                )
-        )
+            action = action,
+            tooltipState = tooltipState,
+            modifier = modifier.testTag(ContainerTestTag)
+        ) {
+            Icon(
+                Icons.Filled.Favorite,
+                contentDescription = null,
+                modifier = Modifier
+                    .testTag(AnchorTestTag)
+                    .tooltipAnchor()
+            )
+        }
     }
 }
 
@@ -323,4 +348,4 @@
 private const val TextTestTag = "Text"
 private const val SubheadTestTag = "Subhead"
 private const val ActionTestTag = "Action"
-private const val AnchorTestTag = "Anchor'"
\ No newline at end of file
+private const val AnchorTestTag = "Anchor"
\ No newline at end of file
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 46adec3..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()
                 }
             }
         }
@@ -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
                 }
@@ -645,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..731e5348 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
@@ -93,6 +93,12 @@
         Strings.DatePickerTodayDescription -> resources.getString(
             androidx.compose.material3.R.string.date_picker_today_description
         )
+        Strings.DatePickerScrollToShowLaterYears -> resources.getString(
+            androidx.compose.material3.R.string.date_picker_scroll_to_later_years
+        )
+        Strings.DatePickerScrollToShowEarlierYears -> resources.getString(
+            androidx.compose.material3.R.string.date_picker_scroll_to_earlier_years
+        )
         Strings.DateInputTitle -> resources.getString(
             androidx.compose.material3.R.string.date_input_title
         )
@@ -123,6 +129,27 @@
         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.DateRangePickerEndHeadline -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_end_headline
+        )
+        Strings.DateRangePickerScrollToShowNextMonth -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_scroll_to_next_month
+        )
+        Strings.DateRangePickerScrollToShowPreviousMonth -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_scroll_to_previous_month
+        )
+        Strings.DateRangeInputTitle -> resources.getString(
+            androidx.compose.material3.R.string.date_range_input_title
+        )
+        Strings.DateRangeInputInvalidRangeInput -> resources.getString(
+            androidx.compose.material3.R.string.date_range_input_invalid_range_input
+        )
         Strings.TooltipLongPressLabel -> resources.getString(
             androidx.compose.material3.R.string.tooltip_long_press_label
         )
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.kt
new file mode 100644
index 0000000..ea45cd6
--- /dev/null
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/TimeFormat.android.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.compose.material3
+
+import android.text.format.DateFormat.is24HourFormat
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.ui.platform.LocalContext
+
+internal actual val is24HourFormat: Boolean
+    @Composable
+    @ReadOnlyComposable get() = is24HourFormat(LocalContext.current)
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 96bb70c..ed3609f 100644
--- a/compose/material3/material3/src/androidMain/res/values-af/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-af/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 9a4df26..0bacfb0 100644
--- a/compose/material3/material3/src/androidMain/res/values-am/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-am/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 0832f50..220c465 100644
--- a/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 77e8396..33a6285 100644
--- a/compose/material3/material3/src/androidMain/res/values-as/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-as/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 242fc3c..071c433 100644
--- a/compose/material3/material3/src/androidMain/res/values-az/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-az/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2d43968..2deaf42 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 ee3326d..16e3b60 100644
--- a/compose/material3/material3/src/androidMain/res/values-be/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-be/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 86d6179..2ddcdc6 100644
--- a/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 639d1bb..940a923 100644
--- a/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 087095c..f6560a7 100644
--- a/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2789ab2..5014277 100644
--- a/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 b92fbfc..6164acc 100644
--- a/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 847d46c..f31181f 100644
--- a/compose/material3/material3/src/androidMain/res/values-da/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-da/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 d902afe..718b72d 100644
--- a/compose/material3/material3/src/androidMain/res/values-de/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-de/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 126035d..9599926 100644
--- a/compose/material3/material3/src/androidMain/res/values-el/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-el/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 e982706..644dfdc 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
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"Select dates"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"Start date"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"End date"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"Enter dates"</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>
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 adb11ab..a1e39c2 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
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"Select dates"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"Start date"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"End date"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"Enter dates"</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>
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 e982706..644dfdc 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
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"Select dates"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"Start date"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"End date"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"Enter dates"</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>
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 e982706..644dfdc 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
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"Select dates"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"Start date"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"End date"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"Enter dates"</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>
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 64b9538..5d19ba5 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
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎Select dates‎‏‎‎‏‎"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎Start date‎‏‎‎‏‎"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎End date‎‏‎‎‏‎"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎Enter dates‎‏‎‎‏‎"</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>
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 e04242d..c88157d 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 7157343..fb5408b 100644
--- a/compose/material3/material3/src/androidMain/res/values-es/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-es/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 105abf2..91b5077 100644
--- a/compose/material3/material3/src/androidMain/res/values-et/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-et/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 71b0385..0eb3a36 100644
--- a/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 7ce35cc..70e1133 100644
--- a/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 03cf22d..31235bd 100644
--- a/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2abd019..4ebb547 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 37c55cc..f7898bc 100644
--- a/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 a2fa6f8..f738e38 100644
--- a/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 ff7f383..b481443 100644
--- a/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 38d0eca..20b942a 100644
--- a/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 12709b5..6bfe1fa 100644
--- a/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 722c0f8..a4edfc2 100644
--- a/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 1ce72fd..baa28ae 100644
--- a/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 c9a3335..ee7ee872 100644
--- a/compose/material3/material3/src/androidMain/res/values-in/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-in/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 748dfa4..c947319 100644
--- a/compose/material3/material3/src/androidMain/res/values-is/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-is/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 b0c19d2..7c4f5d0 100644
--- a/compose/material3/material3/src/androidMain/res/values-it/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-it/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 73a6c27..8d7d421 100644
--- a/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 5e74684..fe24ddd 100644
--- a/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"日付の選択"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"開始日"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"終了日"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"日付の入力"</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>
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 88eb89c..6690c91 100644
--- a/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 cbf6ed3..3f027ba 100644
--- a/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 b8356e3..0aa12f9 100644
--- a/compose/material3/material3/src/androidMain/res/values-km/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-km/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 cd54c71..0554682 100644
--- a/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2f628531..b519b03 100644
--- a/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 3e6e538..c81e52c 100644
--- a/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2c6017a..8590323 100644
--- a/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 3ab33d0..191d797 100644
--- a/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 a8c4312..156ea67 100644
--- a/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 0b872f6..2b2bced 100644
--- a/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 104f0a3..6a60c97 100644
--- a/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 216cd28..ebca4e7 100644
--- a/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 09284b8..e95c9a6 100644
--- a/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 7acd62b..1bef8e7 100644
--- a/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
@@ -44,6 +44,10 @@
     <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="date_range_picker_title" msgid="690080476639943577">"Pilih tarikh"</string>
+    <string name="date_range_picker_start_headline" msgid="5759491386723090559">"Tarikh mula"</string>
+    <string name="date_range_picker_end_headline" msgid="4766270708882012148">"Tarikh tamat"</string>
+    <string name="date_range_input_title" msgid="2366412111888449406">"Masukkan tarikh"</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>
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 5aec28b..a029227 100644
--- a/compose/material3/material3/src/androidMain/res/values-my/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-my/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 85768f3..dfe1686 100644
--- a/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 c820f95..dd24118 100644
--- a/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 051711b..9572e68 100644
--- a/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 35c0b41..c502a61 100644
--- a/compose/material3/material3/src/androidMain/res/values-or/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-or/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 09646c0..e69c389 100644
--- a/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 5bb9101..64844da 100644
--- a/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 cfd5be4..31bb3519 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 e61dd37..90e5529 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 cfd5be4..31bb3519 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 421aadf..0469dac 100644
--- a/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 4fd933b..68ed943 100644
--- a/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 372c4d0..2a722e7 100644
--- a/compose/material3/material3/src/androidMain/res/values-si/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-si/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 d83ef09..c149822 100644
--- a/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2e7235c..976a42e 100644
--- a/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 17583c2..920735b 100644
--- a/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 bcc4baa..4d19f41 100644
--- a/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 2b8233b..2e4ccf7 100644
--- a/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 eb057de..263dd67 100644
--- a/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 59efd25..33a7922 100644
--- a/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 be8ceed..c49864c 100644
--- a/compose/material3/material3/src/androidMain/res/values-te/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-te/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 6aa0a32..12e1db9 100644
--- a/compose/material3/material3/src/androidMain/res/values-th/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-th/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 c78a878..74f8d82 100644
--- a/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 48934fe..a43e55d 100644
--- a/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 d73d220..f4525e9 100644
--- a/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 87423e7..471f334 100644
--- a/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 5e87b62..d7a21c0 100644
--- a/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 9ed82e5..54c032a 100644
--- a/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 34da824..ac3ebee4 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 cdc9f9d..841d091 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 087bbb0..6878480 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
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
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 6ed66b5..b59cfd0 100644
--- a/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
@@ -44,6 +44,14 @@
     <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>
+    <!-- no translation found for date_range_picker_title (690080476639943577) -->
+    <skip />
+    <!-- no translation found for date_range_picker_start_headline (5759491386723090559) -->
+    <skip />
+    <!-- no translation found for date_range_picker_end_headline (4766270708882012148) -->
+    <skip />
+    <!-- no translation found for date_range_input_title (2366412111888449406) -->
+    <skip />
     <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>
diff --git a/compose/material3/material3/src/androidMain/res/values/strings.xml b/compose/material3/material3/src/androidMain/res/values/strings.xml
index cdbd37b..465ed75 100644
--- a/compose/material3/material3/src/androidMain/res/values/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values/strings.xml
@@ -54,6 +54,22 @@
     </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>
+    <!-- Spoken description for scrolling to display later years -->
+    <string name="date_picker_scroll_to_later_years">Scroll to show later years</string>
+    <!-- Spoken description for scrolling to display earlier years -->
+    <string name="date_picker_scroll_to_earlier_years">Scroll to show earlier years</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>
+    <!-- Spoken description for scrolling to the next month -->
+    <string name="date_range_picker_scroll_to_next_month">Scroll to show the next month</string>
+    <!-- Spoken description for scrolling to the previous month -->
+    <string name="date_range_picker_scroll_to_previous_month">Scroll to show the previous month</string>
+    <string name="date_range_input_title">Enter dates</string>
+    <!--
+    Describes an invalid date range input when a user enters a start or end date [CHAR_LIMIT=NONE]
+    -->
+    <string name="date_range_input_invalid_range_input">Invalid date range input</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/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/CalendarModel.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarModel.kt
index d513a40..9291197 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarModel.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/CalendarModel.kt
@@ -17,6 +17,7 @@
 package androidx.compose.material3
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.ReadOnlyComposable
 import java.util.Locale
 
@@ -285,6 +286,7 @@
  * in a short format, as well as a date pattern with and without a delimiter.
  */
 @ExperimentalMaterial3Api
+@Immutable
 internal data class DateInputFormat(
     val patternWithDelimiters: String,
     val delimiter: Char
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/DateInput.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
index 129ac14..42b31c0 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateInput.kt
@@ -21,6 +21,8 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.text.KeyboardOptions
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -38,6 +40,7 @@
 import androidx.compose.ui.text.input.TransformedText
 import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.unit.dp
+import java.util.Locale
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -46,39 +49,62 @@
     dateFormatter: DatePickerFormatter,
     dateValidator: (Long) -> Boolean,
 ) {
-    DateInputTextField(
-        modifier = Modifier
-            .fillMaxWidth()
-            .padding(InputTextFieldPadding),
-        stateData = stateData,
-        dateFormatter = dateFormatter,
-        dateValidator = dateValidator
-    )
-}
-
-@OptIn(ExperimentalMaterial3Api::class)
-@Composable
-private fun DateInputTextField(
-    modifier: Modifier,
-    stateData: StateData,
-    dateFormatter: DatePickerFormatter,
-    dateValidator: (Long) -> Boolean
-) {
     // Obtain the DateInputFormat for the default Locale.
     val defaultLocale = defaultLocale()
     val dateInputFormat = remember(defaultLocale) {
         stateData.calendarModel.getDateInputFormat(defaultLocale)
     }
-    var errorText by rememberSaveable { mutableStateOf("") }
+    val errorDatePattern = getString(Strings.DateInputInvalidForPattern)
+    val errorDateOutOfYearRange = getString(Strings.DateInputInvalidYearRange)
+    val errorInvalidNotAllowed = getString(Strings.DateInputInvalidNotAllowed)
+    val dateInputValidator = remember(dateInputFormat, dateFormatter) {
+        DateInputValidator(
+            stateData = stateData,
+            dateInputFormat = dateInputFormat,
+            dateFormatter = dateFormatter,
+            dateValidator = dateValidator,
+            errorDatePattern = errorDatePattern,
+            errorDateOutOfYearRange = errorDateOutOfYearRange,
+            errorInvalidNotAllowed = errorInvalidNotAllowed,
+            errorInvalidRangeInput = "" // Not used for a single date input
+        )
+    }
+    DateInputTextField(
+        modifier = Modifier
+            .fillMaxWidth()
+            .padding(InputTextFieldPadding),
+        stateData = stateData,
+        initialDate = stateData.selectedStartDate.value,
+        onDateChanged = { date -> stateData.selectedStartDate.value = date },
+        inputIdentifier = InputIdentifier.SingleDateInput,
+        dateInputValidator = dateInputValidator,
+        dateInputFormat = dateInputFormat,
+        locale = defaultLocale
+    )
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+internal fun DateInputTextField(
+    modifier: Modifier,
+    stateData: StateData,
+    initialDate: CalendarDate?,
+    onDateChanged: (CalendarDate?) -> Unit,
+    inputIdentifier: InputIdentifier,
+    dateInputValidator: DateInputValidator,
+    dateInputFormat: DateInputFormat,
+    locale: Locale
+) {
+    val errorText = rememberSaveable { mutableStateOf("") }
     var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
         mutableStateOf(
             TextFieldValue(
                 text = with(stateData) {
-                    selectedStartDate?.let {
+                    initialDate?.let {
                         calendarModel.formatWithPattern(
                             it.utcTimeMillis,
                             dateInputFormat.patternWithoutDelimiters,
-                            defaultLocale
+                            locale
                         )
                     } ?: ""
                 },
@@ -87,57 +113,6 @@
         )
     }
 
-    // Holds a string for displaying an error message when an input does not match the expected date
-    // pattern. The string expects a date pattern string as an argument to be formatted into it.
-    val errorDatePattern = getString(Strings.DateInputInvalidForPattern)
-    // Holds a string for displaying an error message when an input date exceeds the year-range
-    // defined at the DateInput's state. The string expects a start and end year as arguments to
-    // be formatted into it.
-    val errorDateOutOfYearRange = getString(Strings.DateInputInvalidYearRange)
-    // Holds a string for displaying an error message when an input date does not pass the
-    // DateInput's validator check. The string expects a date argument to be formatted into it.
-    val errorInvalidNotAllowed = getString(Strings.DateInputInvalidNotAllowed)
-
-    // Validates the input. Sets an error message at the errorText, or return a non-null
-    // CalendarDate that represents a validated date.
-    fun validate(input: TextFieldValue): CalendarDate? {
-        val dateInputText = input.text.trim()
-        if (dateInputText.isEmpty() ||
-            dateInputText.length < dateInputFormat.patternWithoutDelimiters.length
-        ) {
-            errorText = ""
-            return null
-        }
-        val parsedDate = stateData.calendarModel.parse(
-            dateInputText,
-            dateInputFormat.patternWithoutDelimiters
-        )
-        if (parsedDate == null) {
-            errorText = errorDatePattern.format(dateInputFormat.patternWithDelimiters.uppercase())
-            return null
-        }
-        // Check that the date is within the valid range of years.
-        if (!stateData.yearRange.contains(parsedDate.year)) {
-            errorText = errorDateOutOfYearRange.format(
-                stateData.yearRange.first,
-                stateData.yearRange.last
-            )
-            return null
-        }
-        // Check that the provided date validator allows this date to be selected.
-        if (!dateValidator.invoke(parsedDate.utcTimeMillis)) {
-            errorText = errorInvalidNotAllowed.format(
-                dateFormatter.formatDate(
-                    date = parsedDate,
-                    calendarModel = stateData.calendarModel,
-                    locale = defaultLocale
-                )
-            )
-            return null
-        }
-        return parsedDate
-    }
-
     OutlinedTextField(
         value = text,
         onValueChange = { input ->
@@ -145,26 +120,45 @@
                 input.text.all { it.isDigit() }
             ) {
                 text = input
-                stateData.selectedStartDate = validate(input)
+                val trimmedText = input.text.trim()
+                if (trimmedText.isEmpty() ||
+                    trimmedText.length < dateInputFormat.patternWithoutDelimiters.length
+                ) {
+                    errorText.value = ""
+                    onDateChanged(null)
+                } else {
+                    val parsedDate = stateData.calendarModel.parse(
+                        trimmedText,
+                        dateInputFormat.patternWithoutDelimiters
+                    )
+                    errorText.value = dateInputValidator.validate(
+                        calendarDate = parsedDate,
+                        inputIdentifier = inputIdentifier,
+                        locale = locale
+                    )
+                    // Set the parsed date only if the error validation returned an empty string.
+                    // Otherwise, set it to null, as the validation failed.
+                    onDateChanged(if (errorText.value.isEmpty()) parsedDate else null)
+                }
             }
         },
         modifier = modifier
             // Add bottom padding when there is no error. Otherwise, remove it as the error text
             // will take additional height.
             .padding(
-                bottom = if (errorText.isNotBlank()) {
+                bottom = if (errorText.value.isNotBlank()) {
                     0.dp
                 } else {
                     InputTextNonErroneousBottomPadding
                 }
             )
             .semantics {
-                if (errorText.isNotBlank()) error(errorText)
+                if (errorText.value.isNotBlank()) error(errorText.value)
             },
         label = { Text(getString(string = Strings.DateInputLabel)) },
         placeholder = { Text(dateInputFormat.patternWithDelimiters.uppercase()) },
-        supportingText = { if (errorText.isNotBlank()) Text(errorText) },
-        isError = errorText.isNotBlank(),
+        supportingText = { if (errorText.value.isNotBlank()) Text(errorText.value) },
+        isError = errorText.value.isNotBlank(),
         visualTransformation = DateVisualTransformation(dateInputFormat),
         keyboardOptions = KeyboardOptions(
             autoCorrect = false,
@@ -176,6 +170,118 @@
 }
 
 /**
+ * A date input validator class.
+ *
+ * @param stateData the [StateData] that holds the selected dates info
+ * @param dateInputFormat a [DateInputFormat] that holds date patterns information
+ * @param dateFormatter a [DatePickerFormatter]
+ * @param dateValidator a lambda that takes a date timestamp and return true if the date is a valid
+ * one for selection.
+ * @param errorDatePattern a string for displaying an error message when an input does not match the
+ * expected date pattern. The string expects a date pattern string as an argument to be formatted
+ * into it.
+ * @param errorDateOutOfYearRange a string for displaying an error message when an input date
+ * exceeds the year-range defined at the DateInput's state. The string expects a start and end year
+ * as arguments to be formatted into it.
+ * @param errorInvalidNotAllowed a string for displaying an error message when an input date does
+ * not pass the DateInput's validator check. The string expects a date argument to be formatted into
+ * it.
+ * @param errorInvalidRangeInput a string for displaying an error message when in a range input mode
+ * and one of the input dates is out of order (i.e. the user inputs a start date that is after the
+ * end date, or an end date that is before the start date)
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Stable
+internal class DateInputValidator(
+    private val stateData: StateData,
+    private val dateInputFormat: DateInputFormat,
+    private val dateFormatter: DatePickerFormatter,
+    private val dateValidator: (Long) -> Boolean,
+    private val errorDatePattern: String,
+    private val errorDateOutOfYearRange: String,
+    private val errorInvalidNotAllowed: String,
+    private val errorInvalidRangeInput: String
+) {
+
+    /**
+     * Validates a [CalendarDate] input and returns an error string in case an issue with the given
+     * date is detected, or an empty string in case there are no issues.
+     *
+     * @param calendarDate a [CalendarDate] input
+     * @param inputIdentifier an [InputIdentifier] that provides information about the input field
+     * that is supposed to hold the date.
+     * @param locale the current [Locale]
+     */
+    fun validate(
+        calendarDate: CalendarDate?,
+        inputIdentifier: InputIdentifier,
+        locale: Locale
+    ): String {
+        if (calendarDate == null) {
+            return errorDatePattern.format(dateInputFormat.patternWithDelimiters.uppercase())
+        }
+        // Check that the date is within the valid range of years.
+        if (!stateData.yearRange.contains(calendarDate.year)) {
+            return errorDateOutOfYearRange.format(
+                stateData.yearRange.first.toLocalString(),
+                stateData.yearRange.last.toLocalString()
+            )
+        }
+        // Check that the provided date validator allows this date to be selected.
+        if (!dateValidator.invoke(calendarDate.utcTimeMillis)) {
+            return errorInvalidNotAllowed.format(
+                dateFormatter.formatDate(
+                    date = calendarDate,
+                    calendarModel = stateData.calendarModel,
+                    locale = locale
+                )
+            )
+        }
+
+        // Additional validation when the InputIdentifier is for start of end dates in a range input
+        if ((inputIdentifier == InputIdentifier.StartDateInput &&
+                calendarDate.utcTimeMillis >= (stateData.selectedEndDate.value?.utcTimeMillis
+                ?: Long.MAX_VALUE)) ||
+            (inputIdentifier == InputIdentifier.EndDateInput &&
+                calendarDate.utcTimeMillis <= (stateData.selectedStartDate.value?.utcTimeMillis
+                ?: Long.MIN_VALUE))
+        ) {
+            // The input start date is after the end date, or the end date is before the start date.
+            return errorInvalidRangeInput
+        }
+
+        return ""
+    }
+}
+
+/**
+ * Represents different input identifiers for the [DateInputTextField]. An `InputIdentifier` is used
+ * when validating the user input, and especially when validating an input range.
+ */
+@Immutable
+@JvmInline
+internal value class InputIdentifier internal constructor(internal val value: Int) {
+
+    companion object {
+        /** Single date input */
+        val SingleDateInput = InputIdentifier(0)
+
+        /** A start date input */
+        val StartDateInput = InputIdentifier(1)
+
+        /** An end date input */
+        val EndDateInput = InputIdentifier(2)
+    }
+
+    override fun toString() = when (this) {
+        SingleDateInput -> "SingleDateInput"
+        StartDateInput -> "StartDateInput"
+        EndDateInput -> "EndDateInput"
+        else -> "Unknown"
+    }
+}
+
+/**
  * A [VisualTransformation] for date input. The transformation will automatically display the date
  * delimiters provided by the [DateInputFormat] as the date is being entered into the text field.
  */
@@ -228,7 +334,7 @@
     }
 }
 
-private val InputTextFieldPadding = PaddingValues(
+internal val InputTextFieldPadding = PaddingValues(
     start = 12.dp,
     end = 12.dp,
     top = 10.dp
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..6df721d 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
@@ -48,6 +48,7 @@
 import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.grid.GridCells
+import androidx.compose.foundation.lazy.grid.LazyGridState
 import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
 import androidx.compose.foundation.lazy.grid.rememberLazyGridState
 import androidx.compose.foundation.lazy.rememberLazyListState
@@ -79,23 +80,28 @@
 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
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.semantics.CustomAccessibilityAction
 import androidx.compose.ui.semantics.LiveRegionMode
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.ScrollAxisRange
 import androidx.compose.ui.semantics.clearAndSetSemantics
 import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.customActions
 import androidx.compose.ui.semantics.horizontalScrollAxisRange
+import androidx.compose.ui.semantics.isContainer
 import androidx.compose.ui.semantics.liveRegion
 import androidx.compose.ui.semantics.paneTitle
 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
@@ -103,6 +109,7 @@
 import java.lang.Integer.max
 import java.text.NumberFormat
 import java.util.Locale
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 
 // TODO: External preview image.
@@ -158,10 +165,24 @@
         title = title,
         headline = headline,
         modeToggleButton = if (showModeToggle) {
-            { DateEntryModeToggleButton(stateData = state.stateData) }
+            {
+                DisplayModeToggleButton(
+                    displayMode = state.displayMode,
+                    onDisplayModeChange = { displayMode ->
+                        state.stateData.switchDisplayMode(
+                            displayMode
+                        )
+                    },
+                )
+            }
         } else {
             null
         },
+        headlineTextStyle = MaterialTheme.typography.fromToken(
+            DatePickerModalTokens.HeaderHeadlineFont
+        ),
+        headerMinHeight = DatePickerModalTokens.HeaderContainerHeight,
+        headerContentPadding = DatePickerHeaderPadding,
         colors = colors
     ) {
         SwitchableDateEntryContent(
@@ -255,7 +276,7 @@
      */
     @get:Suppress("AutoBoxing")
     val selectedDateMillis by derivedStateOf {
-        stateData.selectedStartDate?.utcTimeMillis
+        stateData.selectedStartDate.value?.utcTimeMillis
     }
 
     /**
@@ -308,6 +329,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 +362,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 +384,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.value,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+            val verboseDateDescription = dateFormatter.formatDate(
+                date = selectedStartDate.value,
+                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 +540,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 +665,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 +691,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 +824,7 @@
     /**
      * A mutable state of [CalendarDate] that represents the start date for a selection.
      */
-    internal var selectedStartDate by mutableStateOf(
+    var selectedStartDate = mutableStateOf(
         if (initialSelectedStartDateMillis != null) {
             val date = calendarModel.getCanonicalDate(
                 initialSelectedStartDateMillis
@@ -745,7 +844,7 @@
      *
      * Single date selection states that use this [StateData] should always have this as `null`.
      */
-    internal var selectedEndDate by mutableStateOf(
+    var selectedEndDate = mutableStateOf(
         // Set to null in case the provided value is "undefined" or <= than the start date.
         if (initialSelectedEndDateMillis != null &&
             initialSelectedStartDateMillis != null &&
@@ -768,7 +867,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 +883,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 +898,7 @@
      * @see [displayedMonth]
      * @see [yearRange]
      */
-    internal val displayedMonthIndex: Int
+    val displayedMonthIndex: Int
         get() = displayedMonth.indexIn(yearRange)
 
     /**
@@ -807,9 +906,28 @@
      *
      * @see [yearRange]
      */
-    internal val totalMonthsInRange: Int
+    val totalMonthsInRange: Int
         get() = (yearRange.last - yearRange.first + 1) * 12
 
+    fun isInRange(date: Long): Boolean {
+        return date >= (selectedStartDate.value?.utcTimeMillis ?: Long.MAX_VALUE) &&
+            date <= (selectedEndDate.value?.utcTimeMillis ?: Long.MIN_VALUE)
+    }
+
+    fun switchDisplayMode(displayMode: DisplayMode) {
+        // Update the displayed month, if needed, and change the mode to a  date-picker.
+        selectedStartDate.value?.let {
+            displayedMonth = calendarModel.getMonth(it)
+        }
+        // When toggling back from an input mode, it's possible that the user input an invalid
+        // start date and a valid end date. If this is the case, and the start date is null, ensure
+        // that the end date is also null.
+        if (selectedStartDate.value == null && selectedEndDate.value != null) {
+            selectedEndDate.value = null
+        }
+        this.displayMode.value = displayMode
+    }
+
     companion object {
         /**
          * A [Saver] implementation for [StateData].
@@ -817,8 +935,8 @@
         fun Saver(): Saver<StateData, Any> = listSaver(
             save = {
                 listOf(
-                    it.selectedStartDate?.utcTimeMillis,
-                    it.selectedEndDate?.utcTimeMillis,
+                    it.selectedStartDate.value?.utcTimeMillis,
+                    it.selectedEndDate.value?.utcTimeMillis,
                     it.displayedMonth.startUtcTimeMillis,
                     it.yearRange.first,
                     it.yearRange.last,
@@ -850,20 +968,26 @@
     headline: @Composable () -> Unit,
     modeToggleButton: (@Composable () -> Unit)?,
     colors: DatePickerColors,
+    headlineTextStyle: TextStyle,
+    headerMinHeight: Dp,
+    headerContentPadding: PaddingValues,
     content: @Composable () -> Unit
 ) {
     Column(
         modifier = modifier
             .sizeIn(minWidth = DatePickerModalTokens.ContainerWidth)
             .padding(DatePickerHorizontalPadding)
+            .semantics { isContainer = true }
     ) {
         DatePickerHeader(
             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()
@@ -873,75 +997,26 @@
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-internal fun DateEntryModeToggleButton(stateData: StateData) {
-    with(stateData) {
-        if (displayMode.value == DisplayMode.Picker) {
-            IconButton(onClick = {
-                displayMode.value = DisplayMode.Input
-            }) {
-                Icon(
-                    imageVector = Icons.Filled.Edit,
-                    contentDescription = getString(Strings.DatePickerSwitchToInputMode)
-                )
-            }
-        } else {
-            IconButton(
-                onClick = {
-                    // Update the displayed month, if needed, and change the mode to a
-                    // date-picker.
-                    selectedStartDate?.let { displayedMonth = calendarModel.getMonth(it) }
-                    displayMode.value = DisplayMode.Picker
-                }
-            ) {
-                Icon(
-                    imageVector = Icons.Filled.DateRange,
-                    contentDescription = getString(Strings.DatePickerSwitchToCalendarMode)
-                )
-            }
+internal fun DisplayModeToggleButton(
+    displayMode: DisplayMode,
+    onDisplayModeChange: (DisplayMode) -> Unit
+) {
+    if (displayMode == DisplayMode.Picker) {
+        IconButton(onClick = { onDisplayModeChange(DisplayMode.Input) }) {
+            Icon(
+                imageVector = Icons.Filled.Edit,
+                contentDescription = getString(Strings.DatePickerSwitchToInputMode)
+            )
         }
-    }
-}
-
-@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 -> ""
+    } else {
+        IconButton(
+            onClick = { onDisplayModeChange(DisplayMode.Picker) }
+        ) {
+            Icon(
+                imageVector = Icons.Filled.DateRange,
+                contentDescription = getString(Strings.DatePickerSwitchToCalendarMode)
+            )
         }
-
-        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
-        )
     }
 }
 
@@ -951,7 +1026,7 @@
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-internal fun SwitchableDateEntryContent(
+private fun SwitchableDateEntryContent(
     state: DatePickerState,
     dateFormatter: DatePickerFormatter,
     dateValidator: (Long) -> Boolean,
@@ -959,7 +1034,10 @@
 ) {
     // TODO(b/266480386): Apply the motion spec for this once we have it. Consider replacing this
     //  with AnimatedContent when it's out of experimental.
-    Crossfade(targetState = state.displayMode, animationSpec = spring()) { mode ->
+    Crossfade(
+        targetState = state.displayMode,
+        animationSpec = spring(),
+        modifier = Modifier.semantics { isContainer = true }) { mode ->
         when (mode) {
             DisplayMode.Picker -> DatePickerContent(
                 stateData = state.stateData,
@@ -990,7 +1068,7 @@
     val coroutineScope = rememberCoroutineScope()
 
     val onDateSelected = { dateInMillis: Long ->
-        stateData.selectedStartDate =
+        stateData.selectedStartDate.value =
             stateData.calendarModel.getCanonicalDate(dateInMillis)
     }
 
@@ -1085,13 +1163,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 +1195,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 +1250,10 @@
                     month = month,
                     onDateSelected = onDateSelected,
                     today = today,
-                    selectedDate = stateData.selectedStartDate,
-                    dateFormatter = dateFormatter,
+                    stateData = stateData,
+                    rangeSelectionEnabled = false,
                     dateValidator = dateValidator,
+                    dateFormatter = dateFormatter,
                     colors = colors
                 )
             }
@@ -1177,18 +1261,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 +1291,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 +1341,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.value,
+                    stateData.selectedEndDate.value
+                )
+            } 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 +1415,33 @@
                             val dateInMillis = month.startUtcTimeMillis +
                                 (dayNumber * MillisecondsIn24Hours)
                             val isToday = dateInMillis == today.utcTimeMillis
+                            val startDateSelected =
+                                dateInMillis == startSelection.value?.utcTimeMillis
+                            val endDateSelected = dateInMillis == endSelection.value?.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 +1467,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,12 +1498,16 @@
     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()
             .requiredSize(
@@ -1359,8 +1522,9 @@
             animate = animateChecked
         ).value,
         contentColor = colors.dayContentColor(
-            today = today,
+            isToday = today,
             selected = selected,
+            inRange = inRange,
             enabled = enabled,
         ).value,
         border = if (today && !selected) {
@@ -1405,6 +1569,9 @@
         } else {
             colors.containerColor
         }
+        val coroutineScope = rememberCoroutineScope()
+        val scrollToEarlierYearsLabel = getString(Strings.DatePickerScrollToShowEarlierYears)
+        val scrollToLaterYearsLabel = getString(Strings.DatePickerScrollToShowLaterYears)
         LazyVerticalGrid(
             columns = GridCells.Fixed(YearsInRow),
             modifier = modifier
@@ -1427,7 +1594,21 @@
                             height = DatePickerModalTokens.SelectionYearContainerHeight
                         )
                         .semantics {
-                            role = Role.Button
+                            // Apply a11y custom actions to the first and last items in the years
+                            // grid. The actions will suggest to scroll to earlier or later years in
+                            // the grid.
+                            customActions = if (lazyGridState.firstVisibleItemIndex == it ||
+                                lazyGridState.layoutInfo.visibleItemsInfo.lastOrNull()?.index == it
+                            ) {
+                                customScrollActions(
+                                    state = lazyGridState,
+                                    coroutineScope = coroutineScope,
+                                    scrollUpLabel = scrollToEarlierYearsLabel,
+                                    scrollDownLabel = scrollToLaterYearsLabel
+                                )
+                            } else {
+                                emptyList()
+                            }
                         },
                     selected = selectedYear == displayedYear,
                     currentYear = selectedYear == currentYear,
@@ -1474,14 +1655,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()
@@ -1587,19 +1768,58 @@
     }
 }
 
+private fun customScrollActions(
+    state: LazyGridState,
+    coroutineScope: CoroutineScope,
+    scrollUpLabel: String,
+    scrollDownLabel: String
+): List<CustomAccessibilityAction> {
+    val scrollUpAction = {
+        if (!state.canScrollBackward) {
+            false
+        } else {
+            coroutineScope.launch {
+                state.scrollToItem(state.firstVisibleItemIndex - YearsInRow)
+            }
+            true
+        }
+    }
+    val scrollDownAction = {
+        if (!state.canScrollForward) {
+            false
+        } else {
+            coroutineScope.launch {
+                state.scrollToItem(state.firstVisibleItemIndex + YearsInRow)
+            }
+            true
+        }
+    }
+    return listOf(
+        CustomAccessibilityAction(
+            label = scrollUpLabel,
+            action = scrollUpAction
+        ),
+        CustomAccessibilityAction(
+            label = scrollDownLabel,
+            action = scrollDownAction
+        )
+    )
+}
+
 /**
  * Returns a string representation of an integer at the current Locale.
  */
-private fun Int.toLocalString(): String {
+internal fun Int.toLocalString(): String {
     val formatter = NumberFormat.getIntegerInstance()
     // Eliminate any use of delimiters when formatting the integer.
     formatter.isGroupingUsed = false
     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 +1829,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/DateRangeInput.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt
new file mode 100644
index 0000000..19f4293
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangeInput.kt
@@ -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.compose.material3
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+internal fun DateRangeInputContent(
+    stateData: StateData,
+    dateFormatter: DatePickerFormatter,
+    dateValidator: (Long) -> Boolean,
+) {
+    // Obtain the DateInputFormat for the default Locale.
+    val defaultLocale = defaultLocale()
+    val dateInputFormat = remember(defaultLocale) {
+        stateData.calendarModel.getDateInputFormat(defaultLocale)
+    }
+    val errorDatePattern = getString(Strings.DateInputInvalidForPattern)
+    val errorDateOutOfYearRange = getString(Strings.DateInputInvalidYearRange)
+    val errorInvalidNotAllowed = getString(Strings.DateInputInvalidNotAllowed)
+    val errorInvalidRange = getString(Strings.DateRangeInputInvalidRangeInput)
+    val dateInputValidator = remember(dateInputFormat, dateFormatter) {
+        DateInputValidator(
+            stateData = stateData,
+            dateInputFormat = dateInputFormat,
+            dateFormatter = dateFormatter,
+            dateValidator = dateValidator,
+            errorDatePattern = errorDatePattern,
+            errorDateOutOfYearRange = errorDateOutOfYearRange,
+            errorInvalidNotAllowed = errorInvalidNotAllowed,
+            errorInvalidRangeInput = errorInvalidRange
+        )
+    }
+    Row(
+        modifier = Modifier.padding(paddingValues = InputTextFieldPadding),
+        horizontalArrangement = Arrangement.spacedBy(TextFieldSpacing)
+    ) {
+        DateInputTextField(
+            modifier = Modifier.weight(0.5f),
+            stateData = stateData,
+            initialDate = stateData.selectedStartDate.value,
+            onDateChanged = { date -> stateData.selectedStartDate.value = date },
+            inputIdentifier = InputIdentifier.StartDateInput,
+            dateInputValidator = dateInputValidator,
+            dateInputFormat = dateInputFormat,
+            locale = defaultLocale
+        )
+        DateInputTextField(
+            modifier = Modifier.weight(0.5f),
+            stateData = stateData,
+            initialDate = stateData.selectedEndDate.value,
+            onDateChanged = { date -> stateData.selectedEndDate.value = date },
+            inputIdentifier = InputIdentifier.EndDateInput,
+            dateInputValidator = dateInputValidator,
+            dateInputFormat = dateInputFormat,
+            locale = defaultLocale
+        )
+    }
+}
+
+private val TextFieldSpacing = 8.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..c8d83ef 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,123 @@
 
 package androidx.compose.material3
 
+import androidx.compose.animation.Crossfade
+import androidx.compose.animation.core.spring
+import androidx.compose.foundation.clickable
+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.rememberCoroutineScope
 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.CustomAccessibilityAction
+import androidx.compose.ui.semantics.LiveRegionMode
+import androidx.compose.ui.semantics.ScrollAxisRange
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.customActions
+import androidx.compose.ui.semantics.isContainer
+import androidx.compose.ui.semantics.liveRegion
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.verticalScrollAxisRange
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+/**
+ * <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 showModeToggle indicates if this DateRangePicker should show a mode toggle action that
+ * transforms it into a date range input
+ * @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
+        )
+    },
+    showModeToggle: Boolean = true,
+    colors: DatePickerColors = DatePickerDefaults.colors()
+) {
+    DateEntryContainer(
+        modifier = modifier,
+        title = title,
+        headline = headline,
+        modeToggleButton = if (showModeToggle) {
+            {
+                DisplayModeToggleButton(
+                    displayMode = state.displayMode,
+                    onDisplayModeChange = { displayMode ->
+                        state.stateData.switchDisplayMode(
+                            displayMode
+                        )
+                    }
+                )
+            }
+        } else {
+            null
+        },
+        headlineTextStyle = MaterialTheme.typography.fromToken(
+            DatePickerModalTokens.RangeSelectionHeaderHeadlineFont
+        ),
+        headerMinHeight = DatePickerModalTokens.RangeSelectionHeaderContainerHeight -
+            HeaderHeightOffset,
+        headerContentPadding = DateRangePickerHeaderPadding,
+        colors = colors
+    ) {
+        SwitchableDateEntryContent(
+            state = state,
+            dateFormatter = dateFormatter,
+            dateValidator = dateValidator,
+            colors = colors
+        )
+    }
+}
 
 /**
  * Creates a [DateRangePickerState] for a [DateRangePicker] that is remembered across compositions.
@@ -41,7 +151,7 @@
  */
 @Composable
 @ExperimentalMaterial3Api
-internal fun rememberDateRangePickerState(
+fun rememberDateRangePickerState(
     @Suppress("AutoBoxing") initialSelectedStartDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialSelectedEndDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? =
@@ -69,7 +179,7 @@
  */
 @ExperimentalMaterial3Api
 @Stable
-internal class DateRangePickerState private constructor(internal val stateData: StateData) {
+class DateRangePickerState private constructor(internal val stateData: StateData) {
 
     /**
      * Constructs a DateRangePickerState.
@@ -116,7 +226,7 @@
      */
     @get:Suppress("AutoBoxing")
     val selectedStartDateMillis by derivedStateOf {
-        stateData.selectedStartDate?.utcTimeMillis
+        stateData.selectedStartDate.value?.utcTimeMillis
     }
 
     /**
@@ -129,7 +239,7 @@
      */
     @get:Suppress("AutoBoxing")
     val selectedEndDateMillis by derivedStateOf {
-        stateData.selectedEndDate?.utcTimeMillis
+        stateData.selectedEndDate.value?.utcTimeMillis
     }
 
     /**
@@ -150,3 +260,527 @@
         )
     }
 }
+
+/**
+ * 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.value,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+
+            val formatterEndDate = dateFormatter.formatDate(
+                date = selectedEndDate.value,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+
+            val verboseStartDateDescription = dateFormatter.formatDate(
+                date = selectedStartDate.value,
+                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.value,
+                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()
+                }
+            }
+        }
+    }
+}
+
+/**
+ * Date entry content that displays a [DateRangePickerContent] or a [DateRangeInputContent]
+ * according to the state's display mode.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun SwitchableDateEntryContent(
+    state: DateRangePickerState,
+    dateFormatter: DatePickerFormatter,
+    dateValidator: (Long) -> Boolean,
+    colors: DatePickerColors
+) {
+    // TODO(b/266480386): Apply the motion spec for this once we have it. Consider replacing this
+    //  with AnimatedContent when it's out of experimental.
+    Crossfade(
+        targetState = state.displayMode,
+        animationSpec = spring(),
+        modifier = Modifier.semantics { isContainer = true }) { mode ->
+        when (mode) {
+            DisplayMode.Picker -> DateRangePickerContent(
+                stateData = state.stateData,
+                dateFormatter = dateFormatter,
+                dateValidator = dateValidator,
+                colors = colors
+            )
+
+            DisplayMode.Input -> DateRangeInputContent(
+                stateData = state.stateData,
+                dateFormatter = dateFormatter,
+                dateValidator = dateValidator,
+            )
+        }
+    }
+}
+
+@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
+        )
+    ) {
+        val coroutineScope = rememberCoroutineScope()
+        val scrollToPreviousMonthLabel = getString(Strings.DateRangePickerScrollToShowPreviousMonth)
+        val scrollToNextMonthLabel = getString(Strings.DateRangePickerScrollToShowNextMonth)
+        LazyColumn(
+            // Apply this to have the screen reader traverse outside the visible list of months
+            // and not scroll them by default.
+            modifier = Modifier.semantics {
+                verticalScrollAxisRange = ScrollAxisRange(value = { 0f }, maxValue = { 0f })
+            },
+            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)
+                            .clickable { /* no-op (needed for customActions to operate */ }
+                            .semantics {
+                                customActions = customScrollActions(
+                                    state = lazyListState,
+                                    coroutineScope = coroutineScope,
+                                    scrollUpLabel = scrollToPreviousMonthLabel,
+                                    scrollDownLabel = scrollToNextMonthLabel
+                                )
+                            },
+                        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.value
+        val currentEnd = selectedEndDate.value
+        if ((currentStart == null && currentEnd == null) ||
+            (currentStart != null && currentEnd != null) ||
+            (currentStart != null && date < currentStart)
+        ) {
+            // Reset the selection to "start" only.
+            selectedStartDate.value = date
+            selectedEndDate.value = null
+        } else if (currentStart != null && date > currentStart) {
+            selectedEndDate.value = 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
+            )
+        )
+    }
+}
+
+private fun customScrollActions(
+    state: LazyListState,
+    coroutineScope: CoroutineScope,
+    scrollUpLabel: String,
+    scrollDownLabel: String
+): List<CustomAccessibilityAction> {
+    val scrollUpAction = {
+        if (!state.canScrollBackward) {
+            false
+        } else {
+            coroutineScope.launch {
+                state.scrollToItem(state.firstVisibleItemIndex - 1)
+            }
+            true
+        }
+    }
+    val scrollDownAction = {
+        if (!state.canScrollForward) {
+            false
+        } else {
+            coroutineScope.launch {
+                state.scrollToItem(state.firstVisibleItemIndex + 1)
+            }
+            true
+        }
+    }
+    return listOf(
+        CustomAccessibilityAction(
+            label = scrollUpLabel,
+            action = scrollUpAction
+        ),
+        CustomAccessibilityAction(
+            label = scrollDownLabel,
+            action = scrollDownAction
+        )
+    )
+}
+
+// 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/Strings.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt
index ce64cb0..2b4c752 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
@@ -50,25 +50,34 @@
         val DatePickerHeadlineDescription = Strings(21)
         val DatePickerNoSelectionDescription = Strings(22)
         val DatePickerTodayDescription = Strings(23)
-        val DateInputTitle = Strings(24)
-        val DateInputHeadline = Strings(25)
-        val DateInputLabel = Strings(26)
-        val DateInputHeadlineDescription = Strings(27)
-        val DateInputNoInputDescription = Strings(28)
-        val DateInputInvalidNotAllowed = Strings(29)
-        val DateInputInvalidForPattern = Strings(30)
-        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 DatePickerScrollToShowLaterYears = Strings(24)
+        val DatePickerScrollToShowEarlierYears = Strings(25)
+        val DateInputTitle = Strings(26)
+        val DateInputHeadline = Strings(27)
+        val DateInputLabel = Strings(28)
+        val DateInputHeadlineDescription = Strings(29)
+        val DateInputNoInputDescription = Strings(30)
+        val DateInputInvalidNotAllowed = Strings(31)
+        val DateInputInvalidForPattern = Strings(32)
+        val DateInputInvalidYearRange = Strings(33)
+        val DatePickerSwitchToCalendarMode = Strings(34)
+        val DatePickerSwitchToInputMode = Strings(35)
+        val DateRangePickerTitle = Strings(36)
+        val DateRangePickerStartHeadline = Strings(37)
+        val DateRangePickerEndHeadline = Strings(38)
+        val DateRangePickerScrollToShowNextMonth = Strings(39)
+        val DateRangePickerScrollToShowPreviousMonth = Strings(40)
+        val DateRangeInputTitle = Strings(41)
+        val DateRangeInputInvalidRangeInput = Strings(42)
+        val TooltipLongPressLabel = Strings(43)
+        val TimePickerAM = Strings(44)
+        val TimePickerPM = Strings(45)
+        val TimePickerPeriodToggle = Strings(46)
+        val TimePickerHourSelection = Strings(47)
+        val TimePickerMinuteSelection = Strings(48)
+        val TimePickerHourSuffix = Strings(49)
+        val TimePicker24HourSuffix = Strings(50)
+        val TimePickerMinuteSuffix = Strings(51)
     }
 }
 
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/TabRow.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
index 77881a5..043b2aa 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
@@ -157,7 +157,8 @@
                     constraints.copy(
                         minWidth = tabWidth,
                         maxWidth = tabWidth,
-                        minHeight = tabRowHeight
+                        minHeight = tabRowHeight,
+                        maxHeight = tabRowHeight,
                     )
                 )
             }
@@ -265,7 +266,11 @@
                 maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
             }
 
-            val tabConstraints = constraints.copy(minWidth = minTabWidth, minHeight = layoutHeight)
+            val tabConstraints = constraints.copy(
+                minWidth = minTabWidth,
+                minHeight = layoutHeight,
+                maxHeight = layoutHeight,
+            )
             val tabPlaceables = tabMeasurables
                 .map { it.measure(tabConstraints) }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt
new file mode 100644
index 0000000..01f635a
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimeFormat.kt
@@ -0,0 +1,24 @@
+/*
+ * 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 androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+internal expect val is24HourFormat: Boolean
+  @Composable
+  @ReadOnlyComposable get
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 ef9cb5a..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,15 +337,15 @@
  * 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
- * or `true` for 24 hour format without 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
 @ExperimentalMaterial3Api
 fun rememberTimePickerState(
     initialHour: Int = 0,
     initialMinute: Int = 0,
-    is24Hour: Boolean = false,
+    is24Hour: Boolean = is24HourFormat,
 ): TimePickerState = rememberSaveable(
     saver = TimePickerState.Saver()
 ) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
index 302f4c8..841dd47 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.LinearOutSlowInEasing
+import androidx.compose.animation.core.Transition
 import androidx.compose.animation.core.animateFloat
 import androidx.compose.animation.core.tween
 import androidx.compose.animation.core.updateTransition
@@ -46,6 +47,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.graphics.Color
@@ -245,30 +247,33 @@
         }
     }
 
-    Box {
-        Popup(
-            popupPositionProvider = tooltipPositionProvider,
-            onDismissRequest = {
-                if (tooltipState.isVisible) {
-                    coroutineScope.launch { tooltipState.dismiss() }
+    Box(contentAlignment = Alignment.TopCenter) {
+        val transition = updateTransition(tooltipState.isVisible, label = "Tooltip transition")
+        if (transition.currentState || transition.targetState) {
+            Popup(
+                popupPositionProvider = tooltipPositionProvider,
+                onDismissRequest = {
+                    if (tooltipState.isVisible) {
+                        coroutineScope.launch { tooltipState.dismiss() }
+                    }
                 }
+            ) {
+                Surface(
+                    modifier = modifier
+                        .sizeIn(
+                            minWidth = TooltipMinWidth,
+                            maxWidth = maxWidth,
+                            minHeight = TooltipMinHeight
+                        )
+                        .animateTooltip(transition)
+                        .focusable()
+                        .semantics { liveRegion = LiveRegionMode.Polite },
+                    shape = shape,
+                    color = containerColor,
+                    shadowElevation = elevation,
+                    content = tooltipContent
+                )
             }
-        ) {
-            Surface(
-                modifier = modifier
-                    .sizeIn(
-                        minWidth = TooltipMinWidth,
-                        maxWidth = maxWidth,
-                        minHeight = TooltipMinHeight
-                    )
-                    .animateTooltip(tooltipState.isVisible)
-                    .focusable()
-                    .semantics { liveRegion = LiveRegionMode.Polite },
-                shape = shape,
-                color = containerColor,
-                shadowElevation = elevation,
-                content = tooltipContent
-            )
         }
 
         scope.content()
@@ -484,15 +489,13 @@
 }
 
 private fun Modifier.animateTooltip(
-    showTooltip: Boolean
+    transition: Transition<Boolean>
 ): Modifier = composed(
     inspectorInfo = debugInspectorInfo {
         name = "animateTooltip"
-        properties["showTooltip"] = showTooltip
+        properties["transition"] = transition
     }
 ) {
-    val transition = updateTransition(showTooltip, label = "Tooltip transition")
-
     val scale by transition.animateFloat(
         transitionSpec = {
             if (false isTransitioningTo true) {
@@ -760,5 +763,5 @@
 private val ActionLabelBottomPadding = 8.dp
 internal const val TooltipDuration = 1500L
 // No specification for fade in and fade out duration, so aligning it with the behavior for snack bar
-private const val TooltipFadeInDuration = 150
+internal const val TooltipFadeInDuration = 150
 private const val TooltipFadeOutDuration = 75
\ No newline at end of file
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..b9161ce7 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
@@ -49,6 +49,8 @@
         Strings.DatePickerHeadlineDescription -> "Current selection: %1$"
         Strings.DatePickerNoSelectionDescription -> "None"
         Strings.DatePickerTodayDescription -> "Today"
+        Strings.DatePickerScrollToShowLaterYears -> "Scroll to show later years"
+        Strings.DatePickerScrollToShowEarlierYears -> "Scroll to show earlier years"
         Strings.DateInputTitle -> "Select date"
         Strings.DateInputHeadline -> "Entered date"
         Strings.DateInputLabel -> "Date"
@@ -59,6 +61,13 @@
         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.DateRangePickerScrollToShowNextMonth -> "Scroll to show the next month"
+        Strings.DateRangePickerScrollToShowPreviousMonth -> "Scroll to show the previous month"
+        Strings.DateRangeInputTitle -> "Enter dates"
+        Strings.DateRangeInputInvalidRangeInput -> "Invalid date range input"
         Strings.TooltipLongPressLabel -> "Show tooltip"
         Strings.TimePickerAM -> "AM"
         Strings.TimePickerPM -> "PM"
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/TimeFormat.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/TimeFormat.desktop.kt
new file mode 100644
index 0000000..6f365ff
--- /dev/null
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/TimeFormat.desktop.kt
@@ -0,0 +1,24 @@
+/*
+ * 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 androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+internal actual val is24HourFormat: Boolean
+    @Composable
+    @ReadOnlyComposable get() = false
\ No newline at end of file
diff --git a/compose/material3/material3/src/test/kotlin/androidx/compose/material3/ButtonPaparazziTest.kt b/compose/material3/material3/src/test/kotlin/androidx/compose/material3/ButtonPaparazziTest.kt
new file mode 100644
index 0000000..e386d4e
--- /dev/null
+++ b/compose/material3/material3/src/test/kotlin/androidx/compose/material3/ButtonPaparazziTest.kt
@@ -0,0 +1,253 @@
+/*
+ * 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.material3
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.dp
+import androidx.testutils.paparazzi.androidxPaparazzi
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ButtonPaparazziTest {
+    @get:Rule
+    val paparazzi = androidxPaparazzi()
+
+    @Test
+    fun default_button_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Button(onClick = { }) {
+                        Text("Button")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun default_button_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Button(onClick = { }) {
+                        Text("Button")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_button_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Button(onClick = { }, enabled = false) {
+                        Text("Button")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_button_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Button(onClick = { }, enabled = false) {
+                        Text("Button")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun elevated_button_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Box(
+                        Modifier.requiredSize(
+                            200.dp,
+                            100.dp
+                        ).wrapContentSize().testTag("elevated button")
+                    ) {
+                        ElevatedButton(onClick = {}) { Text("Elevated Button") }
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun elevated_button_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Box(
+                        Modifier.requiredSize(
+                            200.dp,
+                            100.dp
+                        ).wrapContentSize().testTag("elevated button")
+                    ) {
+                        ElevatedButton(onClick = {}) { Text("Elevated Button") }
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_elevated_button_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Box(
+                        Modifier.requiredSize(
+                            200.dp,
+                            100.dp
+                        ).wrapContentSize().testTag("elevated button")
+                    ) {
+                        ElevatedButton(onClick = {}, enabled = false) { Text("Elevated Button") }
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_elevated_button_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Box(
+                        Modifier.requiredSize(
+                            200.dp,
+                            100.dp
+                        ).wrapContentSize().testTag("elevated button")
+                    ) {
+                        ElevatedButton(onClick = {}, enabled = false) { Text("Elevated Button") }
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun button_with_icon_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Button(
+                        onClick = { /* Do something! */ },
+                        contentPadding = ButtonDefaults.ButtonWithIconContentPadding
+                    ) {
+                        Icon(
+                            Icons.Filled.Favorite,
+                            contentDescription = "Localized description",
+                            modifier = Modifier.size(ButtonDefaults.IconSize)
+                        )
+                        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+                        Text("Like")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun button_with_icon_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Button(
+                        onClick = { /* Do something! */ },
+                        contentPadding = ButtonDefaults.ButtonWithIconContentPadding
+                    ) {
+                        Icon(
+                            Icons.Filled.Favorite,
+                            contentDescription = "Localized description",
+                            modifier = Modifier.size(ButtonDefaults.IconSize)
+                        )
+                        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+                        Text("Like")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_button_with_icon_light_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(lightColorScheme()) {
+                Surface {
+                    Button(
+                        onClick = { /* Do something! */ },
+                        contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
+                        enabled = false,
+                    ) {
+                        Icon(
+                            Icons.Filled.Favorite,
+                            contentDescription = "Localized description",
+                            modifier = Modifier.size(ButtonDefaults.IconSize)
+                        )
+                        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+                        Text("Like")
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    fun disabled_button_with_icon_dark_theme() {
+        paparazzi.snapshot {
+            MaterialTheme(darkColorScheme()) {
+                Surface {
+                    Button(
+                        onClick = { /* Do something! */ },
+                        contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
+                        enabled = false,
+                    ) {
+                        Icon(
+                            Icons.Filled.Favorite,
+                            contentDescription = "Localized description",
+                            modifier = Modifier.size(ButtonDefaults.IconSize)
+                        )
+                        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+                        Text("Like")
+                    }
+                }
+            }
+        }
+    }
+}
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-beta02.txt b/compose/runtime/runtime-livedata/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.4.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-livedata/api/public_plus_experimental_1.4.0-beta02.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-livedata/api/res-1.4.0-beta02.txt b/compose/runtime/runtime-livedata/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/res-1.4.0-beta02.txt
diff --git a/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta02.txt b/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
index 352ea84..9733e52 100644
--- a/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
+++ b/compose/runtime/runtime-livedata/src/androidTest/java/androidx/compose/runtime/livedata/LiveDataAdapterTest.kt
@@ -63,6 +63,21 @@
     }
 
     @Test
+    fun preferInitializedValueInFirstComposition() {
+        val liveData = MutableLiveData("value")
+        var firstComposition by mutableStateOf(true)
+        var realValue: String? = null
+        rule.setContent {
+            if (firstComposition) {
+                realValue = liveData.observeAsState("initial").value
+                firstComposition = false
+            }
+        }
+
+        assertThat(realValue).isEqualTo("value")
+    }
+
+    @Test
     fun weReceiveUpdates() {
         val liveData = MutableLiveData<String>()
         liveData.postValue("value")
diff --git a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
index 289a4d0..e077036 100644
--- a/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
+++ b/compose/runtime/runtime-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
@@ -45,6 +45,10 @@
  * be new value posted into the [LiveData] the returned [State] will be updated causing
  * recomposition of every [State.value] usage.
  *
+ * The [initial] value will be used only if this LiveData is not already
+ * [initialized][isInitialized]. Note that if [T] is a non-null type, it is your
+ * responsibility to ensure that any value you set on this LiveData is also non-null.
+ *
  * The inner observer will automatically be removed when this composable disposes or the current
  * [LifecycleOwner] moves to the [Lifecycle.State.DESTROYED] state.
  *
@@ -53,7 +57,10 @@
 @Composable
 fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
     val lifecycleOwner = LocalLifecycleOwner.current
-    val state = remember { mutableStateOf(initial) }
+    val state = remember {
+        @Suppress("UNCHECKED_CAST") /* Initialized values of a LiveData<T> must be a T */
+        mutableStateOf(if (isInitialized) value as T else initial)
+    }
     DisposableEffect(this, lifecycleOwner) {
         val observer = Observer<T> { state.value = it }
         observe(lifecycleOwner, observer)
diff --git a/compose/runtime/runtime-rxjava2/api/1.4.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.4.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/res-1.4.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/res-1.4.0-beta02.txt
diff --git a/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/1.4.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.4.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/res-1.4.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/res-1.4.0-beta02.txt
diff --git a/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable-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-beta02.txt b/compose/runtime/runtime-saveable/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.4.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta02.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/res-1.4.0-beta02.txt b/compose/runtime/runtime-saveable/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/res-1.4.0-beta02.txt
diff --git a/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta02.txt b/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/1.4.0-beta01.txt b/compose/runtime/runtime/api/1.4.0-beta01.txt
index 71912fe..1cb90ed 100644
--- a/compose/runtime/runtime/api/1.4.0-beta01.txt
+++ b/compose/runtime/runtime/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/runtime/runtime/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..1cb90ed
--- /dev/null
+++ b/compose/runtime/runtime/api/1.4.0-beta02.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
deleted file mode 100644
index b2e1b75..0000000
--- a/compose/runtime/runtime/api/current.ignore
+++ /dev/null
@@ -1,11 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.runtime.Composer#disableSourceInformation():
-    Added method androidx.compose.runtime.Composer.disableSourceInformation()
-AddedAbstractMethod: androidx.compose.runtime.Composer#endToMarker(int):
-    Added method androidx.compose.runtime.Composer.endToMarker(int)
-AddedAbstractMethod: androidx.compose.runtime.Composer#getCurrentMarker():
-    Added method androidx.compose.runtime.Composer.getCurrentMarker()
-
-
-RemovedMethod: androidx.compose.runtime.collection.MutableVectorKt#mutableVectorOf(T):
-    Removed method androidx.compose.runtime.collection.MutableVectorKt.mutableVectorOf(T)
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
index 291f5f9..ef1101e 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/runtime/runtime/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..ef1101e
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/runtime/runtime/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime/api/res-1.4.0-beta02.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
index f0329cb..5006380 100644
--- a/compose/runtime/runtime/api/restricted_1.4.0-beta01.txt
+++ b/compose/runtime/runtime/api/restricted_1.4.0-beta01.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/api/restricted_1.4.0-beta02.txt b/compose/runtime/runtime/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..5006380
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index b2e1b75..0000000
--- a/compose/runtime/runtime/api/restricted_current.ignore
+++ /dev/null
@@ -1,11 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.runtime.Composer#disableSourceInformation():
-    Added method androidx.compose.runtime.Composer.disableSourceInformation()
-AddedAbstractMethod: androidx.compose.runtime.Composer#endToMarker(int):
-    Added method androidx.compose.runtime.Composer.endToMarker(int)
-AddedAbstractMethod: androidx.compose.runtime.Composer#getCurrentMarker():
-    Added method androidx.compose.runtime.Composer.getCurrentMarker()
-
-
-RemovedMethod: androidx.compose.runtime.collection.MutableVectorKt#mutableVectorOf(T):
-    Removed method androidx.compose.runtime.collection.MutableVectorKt.mutableVectorOf(T)
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/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-beta02.txt b/compose/ui/ui-android-stubs/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.4.0-beta02.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-beta02.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-android-stubs/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/res-1.4.0-beta02.txt
diff --git a/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta02.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
index 0be492c..50b3067 100644
--- a/compose/ui/ui-geometry/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-geometry/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-geometry/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.4.0-beta02.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.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
index 0be492c..50b3067 100644
--- 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
@@ -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-beta02.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-geometry/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-geometry/api/res-1.4.0-beta02.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
index 0be492c..50b3067 100644
--- a/compose/ui/ui-geometry/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-geometry/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/ui/ui-geometry/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.4.0-beta02.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.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
index 358b6e6..d818cd8 100644
--- a/compose/ui/ui-graphics/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-graphics/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-graphics/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..d818cd8
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.4.0-beta02.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
deleted file mode 100644
index ac8aa37..0000000
--- a/compose/ui/ui-graphics/api/current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.ui.graphics.PathMeasure#getPosition(float):
-    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)
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
index 39ec0533..b8961c4 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b8961c4
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-graphics/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-graphics/api/res-1.4.0-beta02.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
index 5dbda20..63742f0 100644
--- a/compose/ui/ui-graphics/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-graphics/api/restricted_1.4.0-beta01.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-graphics/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-graphics/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..63742f0
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index ac8aa37..0000000
--- a/compose/ui/ui-graphics/api/restricted_current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.compose.ui.graphics.PathMeasure#getPosition(float):
-    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)
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-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
index 6b03b4c..c75966c 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/ParameterFactoryTest.kt
@@ -43,11 +43,14 @@
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.DefaultCameraDistance
+import androidx.compose.ui.graphics.DefaultShadowColor
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.colorspace.ColorModel
 import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.graphics.painter.Painter
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.debugInspectorInfo
@@ -670,6 +673,44 @@
     }
 
     @Test
+    fun testSingleModifierNode() {
+        validate(
+            create(
+                "modifier",
+                Modifier.graphicsLayer(
+                    scaleX = 2f,
+                    scaleY = 1.5f,
+                    alpha = 0.5f,
+                    clip = true
+                )
+            )
+        ) {
+            parameter("modifier", ParameterType.String, "") {
+                parameter("graphicsLayer", ParameterType.String, "") {
+                    parameter("scaleX", ParameterType.Float, 2f)
+                    parameter("scaleY", ParameterType.Float, 1.5f)
+                    parameter("alpha", ParameterType.Float, 0.5f)
+                    parameter("translationX", ParameterType.Float, 0f)
+                    parameter("translationY", ParameterType.Float, 0f)
+                    parameter("shadowElevation", ParameterType.Float, 0f)
+                    parameter("rotationX", ParameterType.Float, 0f)
+                    parameter("rotationY", ParameterType.Float, 0f)
+                    parameter("rotationZ", ParameterType.Float, 0f)
+                    parameter("cameraDistance", ParameterType.Float, DefaultCameraDistance)
+                    parameter("transformOrigin", ParameterType.String, "Center")
+                    parameter("shape", ParameterType.String, "RectangleShape")
+                    parameter("clip", ParameterType.Boolean, true)
+                    // parameter("renderEffect", ParameterType.String, "")
+                    val shadowArgb = DefaultShadowColor.toArgb()
+                    parameter("ambientShadowColor", ParameterType.Color, shadowArgb, index = 14)
+                    parameter("spotShadowColor", ParameterType.Color, shadowArgb, index = 15)
+                    parameter("compositingStrategy", ParameterType.String, "Auto", index = 16)
+                }
+            }
+        }
+    }
+
+    @Test
     fun testWrappedModifier() {
         fun Modifier.frame(color: Color) = inspectable(
             debugInspectorInfo {
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt
new file mode 100644
index 0000000..bfa381b
--- /dev/null
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetector.kt
@@ -0,0 +1,114 @@
+/*
+ * 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:Suppress("UnstableApiUsage")
+
+package androidx.compose.ui.lint
+
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import org.jetbrains.kotlin.psi.KtCallableDeclaration
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.UMethod
+import org.jetbrains.uast.UTypeReferenceExpression
+import org.jetbrains.uast.UastFacade
+import org.jetbrains.uast.convertWithParent
+import org.jetbrains.uast.toUElement
+
+/**
+ * Detects subclasses of ModifierNodeElement that do not override the base `inspectableProperties`
+ * function. Classes that extend from another class which overrides this function satisfy the
+ * inspection.
+ *
+ * We suggest overriding this method to provide more accurate, complete, and consistent data in
+ * the layout inspector. This check reports an error for AndroidX libraries, since we want to ensure
+ * each modifier has full inspection support. Additionally, the base implementation can only work
+ * if kotlin-reflect is in the classpath, which is avoided by having a custom implementation.
+ */
+class ModifierNodeInspectablePropertiesDetector : Detector(), Detector.UastScanner {
+
+    override fun applicableSuperClasses(): List<String> {
+        return listOf("androidx.compose.ui.node.ModifierNodeElement")
+    }
+
+    override fun visitClass(context: JavaContext, declaration: UClass) {
+        if (declaration.qualifiedName == ModifierNodeElementFqName) {
+            return
+        }
+
+        if (declaration.getInspectablePropertiesFunctionOverride() == null) {
+            context.report(
+                ModifierNodeInspectableProperties,
+                declaration,
+                context.getNameLocation(declaration),
+                "${declaration.name} does not override $InspectionFunName(). The layout " +
+                    "inspector will use the default implementation of this function, which " +
+                    "will attempt to read ${declaration.name}'s properties reflectively. " +
+                    "Override $InspectionFunName() if you'd like to customize this modifier's " +
+                    "presentation in the layout inspector."
+            )
+        }
+    }
+
+    private tailrec fun UClass?.getInspectablePropertiesFunctionOverride(): UMethod? {
+        if (this == null || qualifiedName == ModifierNodeElementFqName) {
+            return null
+        }
+
+        return uastDeclarations
+            .filterIsInstance<UMethod>()
+            .firstOrNull { it.hasInspectablePropertiesSignature() }
+            ?: UastFacade.convertWithParent<UClass>(javaPsi.superClass)
+                ?.getInspectablePropertiesFunctionOverride()
+    }
+
+    private fun UMethod.hasInspectablePropertiesSignature(): Boolean {
+        return name == InspectionFunName &&
+            parameters.size == 1 && // The only argument is the receiver
+            receiverFqType == InspectionFunFqReceiver
+    }
+
+    private val UMethod.receiverFqType: String?
+        get() {
+            val receiverTypeRef = (sourcePsi as? KtCallableDeclaration)?.receiverTypeReference
+            return (receiverTypeRef?.toUElement() as? UTypeReferenceExpression)?.getQualifiedName()
+        }
+
+    companion object {
+        private const val ModifierNodeElementFqName = "androidx.compose.ui.node.ModifierNodeElement"
+        private const val InspectionFunName = "inspectableProperties"
+        private const val InspectionFunFqReceiver = "androidx.compose.ui.platform.InspectorInfo"
+
+        val ModifierNodeInspectableProperties = Issue.create(
+            "ModifierNodeInspectableProperties",
+            "ModifierNodeElement missing inspectableProperties",
+            "ModifierNodeElements may override inspectableProperties() to provide information " +
+                "about the modifier in the layout inspector. The default implementation attempts " +
+                "to read all of the properties on the class reflectively, which may not " +
+                "comprehensively or effectively describe the modifier.",
+            Category.PRODUCTIVITY, 4, Severity.INFORMATIONAL,
+            Implementation(
+                ModifierNodeInspectablePropertiesDetector::class.java,
+                Scope.JAVA_FILE_SCOPE
+            )
+        )
+    }
+}
\ No newline at end of file
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..d296f22 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,
@@ -35,6 +35,7 @@
         ModifierDeclarationDetector.ModifierFactoryExtensionFunction,
         ModifierDeclarationDetector.ModifierFactoryReturnType,
         ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver,
+        ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties,
         ModifierParameterDetector.ModifierParameter,
         ReturnFromAwaitPointerEventScopeDetector.ExitAwaitPointerEventScope,
         MultipleAwaitPointerEventScopesDetector.MultipleAwaitPointerEventScopes
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt
new file mode 100644
index 0000000..191e087
--- /dev/null
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierNodeInspectablePropertiesDetectorTest.kt
@@ -0,0 +1,246 @@
+/*
+ * 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.ui.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+
+/* ktlint-disable max-line-length */
+class ModifierNodeInspectablePropertiesDetectorTest : LintDetectorTest() {
+    override fun getDetector(): Detector = ModifierNodeInspectablePropertiesDetector()
+
+    override fun getIssues(): MutableList<Issue> = mutableListOf(
+        ModifierNodeInspectablePropertiesDetector.ModifierNodeInspectableProperties
+    )
+
+    @Test
+    fun testNodeElementWithNoInspectableValues_flagsError() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.platform.InspectableValue
+                import androidx.compose.ui.node.ModifierNodeElement
+
+                class Element : ModifierNodeElement<Modifier.Node>() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                }
+                """
+            ),
+            ModifierStub, InspectableValueStub, ModifierNodeElementStub
+        )
+            .run()
+            .expect(
+                """
+src/test/Element.kt:8: Information: Element does not override inspectableProperties(). The layout inspector will use the default implementation of this function, which will attempt to read Element's properties reflectively. Override inspectableProperties() if you'd like to customize this modifier's presentation in the layout inspector. [ModifierNodeInspectableProperties]
+                class Element : ModifierNodeElement<Modifier.Node>() {
+                      ~~~~~~~
+0 errors, 0 warnings
+                """.trimIndent()
+            )
+    }
+
+    @Test
+    fun testNodeElementWithAlmostInspectableValues_flagsError() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.platform.InspectableValue
+                import androidx.compose.ui.platform.InspectorInfo
+                import androidx.compose.ui.node.ModifierNodeElement
+
+                class ElementWithExtraParam : ModifierNodeElement<Modifier.Node>() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                    // Doesn't override the base declaration
+                    fun InspectorInfo.inspectableProperties(count: Int) {
+                        name = "element"
+                        properties["count"] = count
+                    }
+                }
+                """
+            ),
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.platform.InspectableValue
+                import androidx.compose.ui.platform.InspectorInfo
+                import androidx.compose.ui.node.ModifierNodeElement
+
+                class ElementWithoutReceiver : ModifierNodeElement<Modifier.Node>() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                    // Doesn't override the base declaration
+                    fun inspectableProperties() { }
+                }
+                """
+            ),
+            ModifierStub, InspectableValueStub, ModifierNodeElementStub
+        )
+            .run()
+            .expect(
+                """
+src/test/ElementWithExtraParam.kt:9: Information: ElementWithExtraParam does not override inspectableProperties(). The layout inspector will use the default implementation of this function, which will attempt to read ElementWithExtraParam's properties reflectively. Override inspectableProperties() if you'd like to customize this modifier's presentation in the layout inspector. [ModifierNodeInspectableProperties]
+                class ElementWithExtraParam : ModifierNodeElement<Modifier.Node>() {
+                      ~~~~~~~~~~~~~~~~~~~~~
+src/test/ElementWithoutReceiver.kt:9: Information: ElementWithoutReceiver does not override inspectableProperties(). The layout inspector will use the default implementation of this function, which will attempt to read ElementWithoutReceiver's properties reflectively. Override inspectableProperties() if you'd like to customize this modifier's presentation in the layout inspector. [ModifierNodeInspectableProperties]
+                class ElementWithoutReceiver : ModifierNodeElement<Modifier.Node>() {
+                      ~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 0 warnings
+                """.trimIndent()
+            )
+    }
+
+    @Test
+    fun testNodeElementWithInspectableValues_doesNotFlagError() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.platform.InspectableValue
+                import androidx.compose.ui.platform.InspectorInfo
+                import androidx.compose.ui.node.ModifierNodeElement
+
+                class Element : ModifierNodeElement<Modifier.Node>() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                    override fun InspectorInfo.inspectableProperties() {
+                        name = "element"
+                        properties["count"] = count
+                    }
+                }
+                """
+            ),
+            ModifierStub, InspectableValueStub, ModifierNodeElementStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun testNodeElementWithInheritedInspectableValues_doesNotFlagError() {
+        lint().files(
+            kotlin(
+                """
+                package test
+
+                import androidx.compose.ui.Modifier
+                import androidx.compose.ui.platform.InspectableValue
+                import androidx.compose.ui.platform.InspectorInfo
+                import androidx.compose.ui.node.ModifierNodeElement
+
+                open class Element : ModifierNodeElement<Modifier.Node>() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                    override fun InspectorInfo.inspectableProperties() {
+                        name = "element"
+                        properties["count"] = count
+                    }
+                }
+
+                class InheritingElement : Element() {
+                    override fun create() = object : Modifier.Node() {}
+                    override fun update(node: Modifier.Node) = node
+                }
+                """
+            ),
+            ModifierStub, InspectableValueStub, ModifierNodeElementStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    companion object {
+        private val ModifierStub = kotlin(
+            """
+            package androidx.compose.ui
+
+            interface Modifier {
+                interface Node
+                interface Element
+            }
+            """
+        )
+
+        private val InspectableValueStub = kotlin(
+            """
+            package androidx.compose.ui.platform
+
+            import androidx.compose.ui.Modifier
+
+            interface InspectableValue {
+                val inspectableElements: Sequence<ValueElement>
+                    get() = emptySequence()
+
+                val nameFallback: String?
+                    get() = null
+
+                val valueOverride: Any?
+                    get() = null
+            }
+
+            data class ValueElement(val name: String, val value: Any?)
+
+            class InspectorInfo {
+                var name: String? = null
+                var value: Any? = null
+                val properties = ValueElementSequence()
+            }
+
+            class ValueElementSequence : Sequence<ValueElement> {
+                private val elements = mutableListOf<ValueElement>()
+
+                override fun iterator(): Iterator<ValueElement> = elements.iterator()
+
+                operator fun set(name: String, value: Any?) {
+                    elements.add(ValueElement(name, value))
+                }
+            }
+            """
+        )
+
+        private val ModifierNodeElementStub = kotlin(
+            """
+            package androidx.compose.ui.node
+
+            abstract class ModifierNodeElement<N : Modifier.Node> : Modifier.Element {
+
+                abstract fun create(): N
+
+                abstract fun update(node: N): N
+
+                open fun InspectorInfo.inspectableProperties() {
+                    // Reflective implementation omitted from the stubs.
+                }
+            }
+            """
+        )
+    }
+}
+/* ktlint-enable max-line-length */
\ No newline at end of file
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
index fa23fb8eb..94a0fe4 100644
--- a/compose/ui/ui-test-junit4/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-test-junit4/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-test-junit4/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..94a0fe4
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.4.0-beta02.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.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
index 850087e..53f3965 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..53f3965
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-test-junit4/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/res-1.4.0-beta02.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
index fa23fb8eb..94a0fe4 100644
--- 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
@@ -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/restricted_1.4.0-beta02.txt b/compose/ui/ui-test-junit4/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..94a0fe4
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.4.0-beta02.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.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-beta02.txt b/compose/ui/ui-test-manifest/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/res-1.4.0-beta02.txt b/compose/ui/ui-test-manifest/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/res-1.4.0-beta02.txt
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta02.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
index bd6bf9d..ae53863 100644
--- a/compose/ui/ui-test/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-test/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-test/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..ae53863
--- /dev/null
+++ b/compose/ui/ui-test/api/1.4.0-beta02.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.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
index b8e19f7..625ea2f 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-test/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..625ea2f
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-test/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test/api/res-1.4.0-beta02.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
index 1cb6dfa..8264e10 100644
--- a/compose/ui/ui-test/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-test/api/restricted_1.4.0-beta01.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-test/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-test/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..8264e10
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.4.0-beta02.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.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
index 5bcabac..b93d5c2 100644
--- 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
@@ -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/1.4.0-beta02.txt b/compose/ui/ui-text-google-fonts/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/1.4.0-beta02.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.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
index 5bcabac..b93d5c2 100644
--- 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
@@ -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-beta02.txt b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-text-google-fonts/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/res-1.4.0-beta02.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
index 5bcabac..b93d5c2 100644
--- 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
@@ -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/restricted_1.4.0-beta02.txt b/compose/ui/ui-text-google-fonts/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/restricted_1.4.0-beta02.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.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
index 8fc4fc2..1d00051 100644
--- a/compose/ui/ui-text/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-text/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-text/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..1d00051
--- /dev/null
+++ b/compose/ui/ui-text/api/1.4.0-beta02.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
deleted file mode 100644
index 24501fb..0000000
--- a/compose/ui/ui-text/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// 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
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
index 1b0de80..9e33150 100644
--- 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
@@ -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);
@@ -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);
@@ -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,9 +481,6 @@
     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;
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-text/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..9e33150
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.4.0-beta02.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 1b0de80..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);
@@ -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);
@@ -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,9 +481,6 @@
     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;
@@ -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-beta02.txt b/compose/ui/ui-text/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text/api/res-1.4.0-beta02.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
index 8fc4fc2..1d00051 100644
--- a/compose/ui/ui-text/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-text/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/ui/ui-text/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..1d00051
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index 24501fb..0000000
--- a/compose/ui/ui-text/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// 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
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-tooling-data/api/1.4.0-beta01.txt b/compose/ui/ui-tooling-data/api/1.4.0-beta01.txt
index ab1e1a2..e6f50d0 100644
--- a/compose/ui/ui-tooling-data/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-tooling-data/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-tooling-data/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
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-beta02.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..899fa9f
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-tooling-data/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/res-1.4.0-beta02.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
index ab1e1a2..e6f50d0 100644
--- 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
@@ -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/restricted_1.4.0-beta02.txt b/compose/ui/ui-tooling-data/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
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
index 01e7297..a5363d9 100644
--- a/compose/ui/ui-tooling-preview/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-tooling-preview/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-tooling-preview/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/1.4.0-beta02.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.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
index 01e7297..a5363d9 100644
--- 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
@@ -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-beta02.txt b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-tooling-preview/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/res-1.4.0-beta02.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
index 01e7297..a5363d9 100644
--- 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
@@ -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/restricted_1.4.0-beta02.txt b/compose/ui/ui-tooling-preview/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/restricted_1.4.0-beta02.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.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
index d19be8b..94b79be 100644
--- a/compose/ui/ui-tooling/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-tooling/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui-tooling/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..94b79be
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.4.0-beta02.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
deleted file mode 100644
index fd7c564..0000000
--- a/compose/ui/ui-tooling/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-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
index d26bb08..e9656ce 100644
--- 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
@@ -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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..e9656ce
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-tooling/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling/api/res-1.4.0-beta02.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
index d19be8b..94b79be 100644
--- a/compose/ui/ui-tooling/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-tooling/api/restricted_1.4.0-beta01.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/restricted_1.4.0-beta02.txt b/compose/ui/ui-tooling/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..94b79be
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index fd7c564..0000000
--- a/compose/ui/ui-tooling/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-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/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
index 8c0257c..3826e65 100644
--- a/compose/ui/ui-unit/api/1.4.0-beta01.txt
+++ b/compose/ui/ui-unit/api/1.4.0-beta01.txt
@@ -412,10 +412,3 @@
 
 }
 
-package androidx.compose.ui.unit.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-unit/api/1.4.0-beta02.txt b/compose/ui/ui-unit/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..3826e65
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.4.0-beta02.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.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
index cdfac57..b5b90002 100644
--- 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
@@ -415,10 +415,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-beta02.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b5b90002
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-unit/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-unit/api/res-1.4.0-beta02.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
index c5ff9fa..4572e24 100644
--- a/compose/ui/ui-unit/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui-unit/api/restricted_1.4.0-beta01.txt
@@ -417,10 +417,3 @@
 
 }
 
-package androidx.compose.ui.unit.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-unit/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-unit/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..4572e24
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.4.0-beta02.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.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-beta02.txt b/compose/ui/ui-util/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/1.4.0-beta02.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-beta02.txt b/compose/ui/ui-util/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-util/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-util/api/res-1.4.0-beta02.txt
diff --git a/compose/ui/ui-util/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-util/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.4.0-beta02.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-beta02.txt b/compose/ui/ui-viewbinding/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.4.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/res-1.4.0-beta02.txt b/compose/ui/ui-viewbinding/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/res-1.4.0-beta02.txt
diff --git a/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta02.txt b/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui/api/1.4.0-beta01.txt b/compose/ui/ui/api/1.4.0-beta01.txt
index 4eea595..d27c2ed 100644
--- a/compose/ui/ui/api/1.4.0-beta01.txt
+++ b/compose/ui/ui/api/1.4.0-beta01.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/1.4.0-beta02.txt b/compose/ui/ui/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..d27c2ed
--- /dev/null
+++ b/compose/ui/ui/api/1.4.0-beta02.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
deleted file mode 100644
index b9629b2..0000000
--- a/compose/ui/ui/api/current.ignore
+++ /dev/null
@@ -1,7 +0,0 @@
-// Baseline format: 1.0
-InvalidNullConversion: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean, androidx.compose.ui.graphics.RenderEffect, long, long):
-    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.focus.FocusManagerKt:
-    Removed class androidx.compose.ui.focus.FocusManagerKt
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
index 01283ce..37b8dc1 100644
--- 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
@@ -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;
@@ -175,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 {
   }
 
@@ -189,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);
@@ -355,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);
   }
@@ -401,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);
@@ -532,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;
@@ -569,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 {
@@ -932,13 +899,6 @@
 
 }
 
-package androidx.compose.ui.graphics.vector.compat {
-
-  public final class XmlVectorParser_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.hapticfeedback {
 
   public interface HapticFeedback {
@@ -1636,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;
   }
@@ -1850,9 +1807,6 @@
     property public final long uptimeMillis;
   }
 
-  public final class PointerInputEventProcessorKt {
-  }
-
   public abstract class PointerInputFilter {
     ctor public PointerInputFilter();
     method public boolean getInterceptOutOfBoundsChildEvents();
@@ -1883,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);
   }
@@ -1976,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 {
@@ -2055,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();
@@ -2179,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);
   }
@@ -2245,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);
   }
@@ -2328,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>);
@@ -2492,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;
@@ -2522,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);
@@ -2549,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();
@@ -2581,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();
   }
@@ -2616,9 +2512,6 @@
     method public default boolean sharePointerInputWithSiblings();
   }
 
-  public final class PointerInputModifierNodeKt {
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2647,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 {
@@ -2678,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 {
   }
 
@@ -2716,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();
@@ -2791,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>);
@@ -2807,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();
@@ -2863,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);
@@ -2880,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();
@@ -2960,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();
@@ -3007,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;
@@ -3033,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 {
@@ -3071,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);
@@ -3294,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();
@@ -3463,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 {
@@ -3492,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();
@@ -3584,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/public_plus_experimental_1.4.0-beta02.txt b/compose/ui/ui/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..5462832
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,3413 @@
+// 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> implements androidx.compose.ui.platform.InspectableValue androidx.compose.ui.Modifier.Element {
+    ctor public ModifierNodeElement();
+    method public abstract N create();
+    method public abstract boolean equals(Object? other);
+    method public boolean getAutoInvalidate();
+    method public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public final String? getNameFallback();
+    method public final Object? getValueOverride();
+    method public abstract int hashCode();
+    method public void inspectableProperties(androidx.compose.ui.platform.InspectorInfo);
+    method public abstract N update(N node);
+    property public boolean autoInvalidate;
+    property public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public final String? nameFallback;
+    property public final Object? valueOverride;
+  }
+
+  @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 01283ce..5462832 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;
@@ -175,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 {
   }
 
@@ -189,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);
@@ -355,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);
   }
@@ -401,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);
@@ -532,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;
@@ -569,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 {
@@ -932,13 +899,6 @@
 
 }
 
-package androidx.compose.ui.graphics.vector.compat {
-
-  public final class XmlVectorParser_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.hapticfeedback {
 
   public interface HapticFeedback {
@@ -1636,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;
   }
@@ -1850,9 +1807,6 @@
     property public final long uptimeMillis;
   }
 
-  public final class PointerInputEventProcessorKt {
-  }
-
   public abstract class PointerInputFilter {
     ctor public PointerInputFilter();
     method public boolean getInterceptOutOfBoundsChildEvents();
@@ -1883,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);
   }
@@ -1976,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 {
@@ -2055,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();
@@ -2179,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);
   }
@@ -2245,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);
   }
@@ -2328,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>);
@@ -2492,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;
@@ -2522,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);
@@ -2549,48 +2472,27 @@
     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);
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> implements androidx.compose.ui.platform.InspectableValue androidx.compose.ui.Modifier.Element {
+    ctor public ModifierNodeElement();
     method public abstract N create();
+    method public abstract boolean equals(Object? other);
+    method public boolean getAutoInvalidate();
+    method public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public final String? getNameFallback();
+    method public final Object? getValueOverride();
+    method public abstract int hashCode();
+    method public void inspectableProperties(androidx.compose.ui.platform.InspectorInfo);
     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);
-  }
-
-  public final class MyersDiffKt {
-  }
-
-  public final class NodeChainKt {
-  }
-
-  public final class NodeCoordinatorKt {
-  }
-
-  public final class NodeKindKt {
+    property public boolean autoInvalidate;
+    property public final kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public final String? nameFallback;
+    property public final Object? valueOverride;
   }
 
   @androidx.compose.ui.ExperimentalComposeUiApi public interface ObserverNode extends androidx.compose.ui.node.DelegatableNode {
@@ -2616,9 +2518,6 @@
     method public default boolean sharePointerInputWithSiblings();
   }
 
-  public final class PointerInputModifierNodeKt {
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2647,9 +2546,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 {
@@ -2678,12 +2574,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 {
   }
 
@@ -2716,9 +2606,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();
@@ -2791,12 +2678,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>);
@@ -2807,9 +2688,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();
@@ -2863,12 +2741,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);
@@ -2880,9 +2752,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();
@@ -2960,9 +2829,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();
@@ -3007,9 +2873,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;
@@ -3033,16 +2896,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 {
@@ -3071,9 +2924,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);
@@ -3294,9 +3144,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();
@@ -3463,9 +3310,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 {
@@ -3492,27 +3336,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();
@@ -3584,8 +3409,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-beta02.txt b/compose/ui/ui/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui/api/res-1.4.0-beta02.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
index 6165576..2973b2b 100644
--- a/compose/ui/ui/api/restricted_1.4.0-beta01.txt
+++ b/compose/ui/ui/api/restricted_1.4.0-beta01.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/api/restricted_1.4.0-beta02.txt b/compose/ui/ui/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..2973b2b
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.4.0-beta02.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
deleted file mode 100644
index b9629b2..0000000
--- a/compose/ui/ui/api/restricted_current.ignore
+++ /dev/null
@@ -1,7 +0,0 @@
-// Baseline format: 1.0
-InvalidNullConversion: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean, androidx.compose.ui.graphics.RenderEffect, long, long):
-    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.focus.FocusManagerKt:
-    Removed class androidx.compose.ui.focus.FocusManagerKt
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 d67f31c..13e65d4 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -71,6 +71,11 @@
         implementation("androidx.autofill:autofill:1.0.0")
         implementation(libs.kotlinCoroutinesAndroid)
 
+        // Used to generate debug information in the layout inspector. If not present,
+        // we may fall back to more limited data.
+        compileOnly(libs.kotlinReflect)
+        testImplementation(libs.kotlinReflect)
+
         implementation("androidx.activity:activity:1.7.0-beta01")
         implementation("androidx.activity:activity-ktx:1.5.1")
         implementation("androidx.core:core:1.9.0")
@@ -149,6 +154,10 @@
                 implementation(libs.kotlinStdlibCommon)
                 implementation(libs.kotlinCoroutinesCore)
 
+                // Used to generate debug information in the layout inspector. If not present,
+                // we may fall back to more limited data.
+                compileOnly(libs.kotlinReflect)
+
                 // when updating the runtime version please also update the runtime-saveable version
                 implementation(project(":compose:runtime:runtime"))
                 api(project(":compose:runtime:runtime-saveable"))
@@ -198,6 +207,10 @@
                 }
             }
 
+            commonTest.dependencies {
+                implementation(libs.kotlinReflect)
+            }
+
             // TODO(b/214407011): These dependencies leak into instrumented tests as well. If you
             //  need to add Robolectric (which must be kept out of androidAndroidTest), use a top
             //  level dependencies block instead:
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/DrawModifierSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
index 8203b93..31c7afa 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/DrawModifierSample.kt
@@ -40,7 +40,8 @@
 import androidx.compose.ui.graphics.vector.PathData
 import androidx.compose.ui.graphics.vector.rememberVectorPainter
 import androidx.compose.ui.node.DrawModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.unit.dp
 
 /**
@@ -140,14 +141,17 @@
             drawCircle(color)
         }
     }
-    fun Modifier.circle(color: Color) = this then modifierElementOf(
-        key = color,
-        create = { CircleNode(color) },
-        update = { it.color = color },
-        definitions = {
-            name = "circle"
+    data class CircleElement(val color: Color) : ModifierNodeElement<CircleNode>() {
+        override fun create() = CircleNode(color)
+        override fun update(node: CircleNode): CircleNode {
+            node.color = color
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
+            name = "color"
             properties["color"] = color
         }
-    )
+    }
+    fun Modifier.circle(color: Color) = this then CircleElement(color)
     Box(Modifier.fillMaxSize().circle(Color.Blue))
 }
\ No newline at end of file
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
index 469b655..7ef664a 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/LayoutSample.kt
@@ -35,7 +35,8 @@
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.node.LayoutModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -207,15 +208,20 @@
             }
         }
     }
-    fun Modifier.verticalPadding(padding: Dp) = this then modifierElementOf(
-        key = padding,
-        create = { VerticalPadding(padding) },
-        update = { it.padding = padding },
-        definitions = {
+    data class VerticalPaddingElement(
+        val padding: Dp
+    ) : ModifierNodeElement<VerticalPadding>() {
+        override fun create() = VerticalPadding(padding)
+        override fun update(node: VerticalPadding): VerticalPadding {
+            node.padding = padding
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
             name = "verticalPadding"
             properties["padding"] = padding
         }
-    )
+    }
+    fun Modifier.verticalPadding(padding: Dp) = this then VerticalPaddingElement(padding)
     Box(Modifier.background(Color.Gray).verticalPadding(50.dp)) {
         Box(Modifier.fillMaxSize().background(Color.DarkGray))
     }
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 01ad27a..255c1e0 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
@@ -45,9 +45,10 @@
 import androidx.compose.ui.node.DrawModifierNode
 import androidx.compose.ui.node.GlobalPositionAwareModifierNode
 import androidx.compose.ui.node.LayoutAwareModifierNode
+import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.node.PointerInputModifierNode
 import androidx.compose.ui.node.SemanticsModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.semantics.SemanticsConfiguration
 import androidx.compose.ui.semantics.heading
 import androidx.compose.ui.semantics.onClick
@@ -59,7 +60,8 @@
 fun ModifierUsageSample() {
     Text(
         "Hello, World!",
-        Modifier.padding(16.dp) // Outer padding; outside background
+        Modifier
+            .padding(16.dp) // Outer padding; outside background
             .background(color = Color.Green) // Solid element background color
             .padding(16.dp) // Inner padding; inside background, around text
     )
@@ -72,7 +74,10 @@
 
     fun Modifier.fancy(level: Float) = this.then(FancyModifier(level))
 
-    Row(Modifier.fancy(1f).padding(10.dp)) {
+    Row(
+        Modifier
+            .fancy(1f)
+            .padding(10.dp)) {
         // content
     }
 }
@@ -159,23 +164,29 @@
 @ExperimentalComposeUiApi
 @Sampled
 @Composable
-fun ModifierElementOfSample() {
+fun ModifierNodeElementSample() {
     class Circle(var color: Color) : DrawModifierNode, Modifier.Node() {
         override fun ContentDrawScope.draw() {
             drawCircle(color)
         }
     }
-    fun Modifier.circle(color: Color) = this then modifierElementOf(
-        key = color,
-        create = { Circle(color) },
-        update = { it.color = color },
-        definitions = {
+    data class CircleElement(
+        val color: Color
+    ) : ModifierNodeElement<Circle>() {
+        override fun create() = Circle(color)
+        override fun update(node: Circle): Circle {
+            node.color = color
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
             name = "circle"
             properties["color"] = color
         }
-    )
+    }
+    fun Modifier.circle(color: Color) = this then CircleElement(color)
 }
 
+@Suppress("LocalVariableName")
 @ExperimentalComposeUiApi
 @Sampled
 @Composable
@@ -186,12 +197,24 @@
                 heading()
             }
     }
-    fun Modifier.heading() = this then modifierElementOf(
-        create = { HeadingNode() },
-        definitions = {
+
+    val HeadingElement = object : ModifierNodeElement<HeadingNode>() {
+        override fun create() = HeadingNode()
+
+        override fun update(node: HeadingNode): HeadingNode {
+            // Nothing to update.
+            return node
+        }
+
+        override fun InspectorInfo.inspectableProperties() {
             name = "heading"
         }
-    )
+
+        override fun hashCode(): Int = "heading".hashCode()
+        override fun equals(other: Any?) = (other === this)
+    }
+
+    fun Modifier.heading() = this then HeadingElement
 }
 
 @ExperimentalComposeUiApi
@@ -215,15 +238,23 @@
         }
     }
 
-    fun Modifier.onPointerEvent(callback: (PointerEvent) -> Unit) = this then modifierElementOf(
-        key = callback,
-        create = { OnPointerEventNode(callback) },
-        update = { it.callback = callback },
-        definitions = {
+    data class PointerInputElement(
+        val callback: (PointerEvent) -> Unit
+    ) : ModifierNodeElement<OnPointerEventNode>() {
+        override fun create() = OnPointerEventNode(callback)
+        override fun update(node: OnPointerEventNode): OnPointerEventNode {
+            node.callback = callback
+            return node
+        }
+
+        override fun InspectorInfo.inspectableProperties() {
             name = "onPointerEvent"
             properties["callback"] = callback
         }
-    )
+    }
+
+    fun Modifier.onPointerEvent(callback: (PointerEvent) -> Unit) =
+        this then PointerInputElement(callback)
 }
 
 @ExperimentalComposeUiApi
@@ -236,15 +267,19 @@
         }
     }
 
-    fun Modifier.logSize(id: String) = this then modifierElementOf(
-        key = id,
-        create = { SizeLoggerNode(id) },
-        update = { it.id = id },
-        definitions = {
+    data class LogSizeElement(val id: String) : ModifierNodeElement<SizeLoggerNode>() {
+        override fun create(): SizeLoggerNode = SizeLoggerNode(id)
+        override fun update(node: SizeLoggerNode): SizeLoggerNode {
+            node.id = id
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
             name = "logSize"
             properties["id"] = id
         }
-    )
+    }
+
+    fun Modifier.logSize(id: String) = this then LogSizeElement(id)
 }
 
 @ExperimentalComposeUiApi
@@ -266,15 +301,19 @@
         }
     }
 
-    fun Modifier.logPosition(id: String) = this then modifierElementOf(
-        key = id,
-        create = { PositionLoggerNode(id) },
-        update = { it.id = id },
-        definitions = {
+    data class PositionLoggerElement(val id: String) : ModifierNodeElement<PositionLoggerNode>() {
+        override fun create() = PositionLoggerNode(id)
+        override fun update(node: PositionLoggerNode): PositionLoggerNode {
+            node.id = id
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
             name = "logPosition"
             properties["id"] = id
         }
-    )
+    }
+
+    fun Modifier.logPosition(id: String) = this then PositionLoggerElement(id)
 }
 
 @ExperimentalComposeUiApi
@@ -289,32 +328,44 @@
         override val providedValues = modifierLocalMapOf(loggerLocal to logger)
     }
 
-    class SizeLoggerNode(var id: String) :
-        ModifierLocalNode, LayoutAwareModifierNode, Modifier.Node() {
+    data class ProvideLoggerElement(
+        val logger: Logger
+    ) : ModifierNodeElement<ProvideLoggerNode>() {
+        override fun create() = ProvideLoggerNode(logger)
+        override fun update(node: ProvideLoggerNode): ProvideLoggerNode {
+            node.provide(loggerLocal, logger)
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
+            name = "provideLogger"
+            properties["logger"] = logger
+        }
+    }
+
+    class SizeLoggerNode(
+        var id: String
+    ) : ModifierLocalNode, LayoutAwareModifierNode, Modifier.Node() {
         override fun onRemeasured(size: IntSize) {
             loggerLocal.current.log("The size of $id was $size")
         }
     }
 
-    fun Modifier.logSize(id: String) = this then modifierElementOf(
-        key = id,
-        create = { SizeLoggerNode(id) },
-        update = { it.id = id },
-        definitions = {
+    data class SizeLoggerElement(
+        val id: String
+    ) : ModifierNodeElement<SizeLoggerNode>() {
+        override fun create() = SizeLoggerNode(id)
+        override fun update(node: SizeLoggerNode): SizeLoggerNode {
+            node.id = id
+            return node
+        }
+        override fun InspectorInfo.inspectableProperties() {
             name = "logSize"
             properties["id"] = id
         }
-    )
+    }
 
-    fun Modifier.provideLogger(logger: Logger) = this then modifierElementOf(
-        key = logger,
-        create = { ProvideLoggerNode(logger) },
-        update = { it.provide(loggerLocal, logger) },
-        definitions = {
-            name = "provideLogger"
-            properties["logger"] = logger
-        }
-    )
+    fun Modifier.logSize(id: String) = this then SizeLoggerElement(id)
+    fun Modifier.provideLogger(logger: Logger) = this then ProvideLoggerElement(logger)
 }
 
 @OptIn(ExperimentalComposeUiApi::class)
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 4358f39..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 {
@@ -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/focus/CombinedFocusModifierNodeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
index 721a3089..bb14507 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CombinedFocusModifierNodeTest.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.node.DelegatingNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
@@ -194,17 +194,19 @@
 
     private fun Modifier.combinedFocusNode(combinedFocusNode: CombinedFocusNode): Modifier {
         return this
-            .then(
-                modifierElementOf(
-                    key = combinedFocusNode,
-                    create = { combinedFocusNode },
-                    update = { it.focusState = combinedFocusNode.focusState },
-                    definitions = { name = "CombinedFocusNode" }
-                )
-            )
+            .then(CombinedFocusNodeElement(combinedFocusNode))
             .then(if (delegatedFocusTarget) Modifier else Modifier.focusTarget())
     }
 
+    private data class CombinedFocusNodeElement(
+        val combinedFocusNode: CombinedFocusNode
+    ) : ModifierNodeElement<CombinedFocusNode>() {
+        override fun create(): CombinedFocusNode = combinedFocusNode
+        override fun update(node: CombinedFocusNode) = node.apply {
+            focusState = combinedFocusNode.focusState
+        }
+    }
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "delegatedFocusTarget = {0}")
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
index 99fb704..e2a9849 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitEnterTest.kt
@@ -181,6 +181,12 @@
         rule.runOnIdle {
             assertThat(movedFocusSuccessfully).isFalse()
             assertThat(child.value).isFalse()
+            when (focusDirection) {
+                Left -> assertThat(right.value).isTrue()
+                Right -> assertThat(left.value).isTrue()
+                Up -> assertThat(down.value).isTrue()
+                Down -> assertThat(up.value).isTrue()
+            }
         }
     }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
index d40004d..53968c1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalImplicitExitTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.focus
 
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.focusGroup
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
@@ -143,7 +145,7 @@
      *                   |   Up   |
      *                   |________|
      *                 ________________
-     *                |  focusedItem  |
+     *                |  parent       |
      *   _________    |   _________   |    _________
      *  |  Left  |    |  | child0 |   |   |  Right |
      *  |________|    |  |________|   |   |________|
@@ -156,11 +158,11 @@
     fun moveFocusExit_blockFocusChange() {
         // Arrange.
         val (up, down, left, right, parent) = List(5) { mutableStateOf(false) }
-        val customFocusEnter = Modifier.focusProperties { exit = { Cancel } }
+        val customFocusExit = Modifier.focusProperties { exit = { Cancel } }
         rule.setContentForTest {
             FocusableBox(up, 30, 0, 10, 10)
             FocusableBox(left, 0, 30, 10, 10)
-            FocusableBox(parent, 20, 20, 70, 50, deactivated = true, modifier = customFocusEnter) {
+            FocusableBox(parent, 20, 20, 70, 50, deactivated = true, modifier = customFocusExit) {
                 FocusableBox(focusedItem, 30, 30, 10, 10, initialFocus)
             }
             FocusableBox(right, 100, 35, 10, 10)
@@ -181,6 +183,227 @@
         }
     }
 
+    /**
+     *                    _________
+     *                   |   Up   |
+     *                   |________|
+     *                 ________________
+     *                |  parent       |
+     *   _________    |   _________   |    _________
+     *  |  Left  |    |  | source |   |   |  Right |
+     *  |________|    |  |________|   |   |________|
+     *                |_______________|
+     *                    _________
+     *                   |  Down  |
+     *                   |________|
+     */
+    @OptIn(ExperimentalFoundationApi::class)
+    @Test
+    fun moveFocusExit_cancelExit() {
+        // Arrange.
+        val (up, down, left, right, parent) = List(5) { mutableStateOf(false) }
+        var (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
+
+        val customFocusExit = Modifier
+            .focusProperties { exit = { Cancel } }
+            .focusGroup()
+
+        rule.setContentForTest {
+            FocusableBox(up, 30, 0, 10, 10, upItem)
+            FocusableBox(left, 0, 30, 10, 10, leftItem)
+            FocusableBox(parent, 20, 20, 30, 30, modifier = customFocusExit) {
+                FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+            }
+            FocusableBox(right, 60, 30, 10, 10, rightItem)
+            FocusableBox(down, 30, 60, 10, 10, downItem)
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(up.value).isFalse()
+            assertThat(left.value).isFalse()
+            assertThat(right.value).isFalse()
+            assertThat(down.value).isFalse()
+            assertThat(focusedItem.value).isTrue()
+        }
+    }
+
+    /**
+     *   _________        _________
+     *  |  dest  |       |   Up   |
+     *  |________|       |________|
+     *                 ________________
+     *                |  parent       |
+     *   _________    |   _________   |    _________
+     *  |  Left  |    |  | source |   |   |  Right |
+     *  |________|    |  |________|   |   |________|
+     *                |_______________|
+     *                    _________
+     *                   |  Down  |
+     *                   |________|
+     */
+    @OptIn(ExperimentalFoundationApi::class)
+    @Test
+    fun moveFocusExit_redirectExit() {
+        // Arrange.
+        val destItem = FocusRequester()
+        val (dest, parent) = List(4) { mutableStateOf(false) }
+        val (up, down, left, right) = List(4) { mutableStateOf(false) }
+        var (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
+
+        val customFocusExit = Modifier
+            .focusProperties {
+                exit = {
+                    initialFocus.requestFocus()
+                    Cancel
+                }
+            }
+            .focusGroup()
+
+        rule.setContentForTest {
+            FocusableBox(dest, 0, 0, 10, 10, destItem)
+            FocusableBox(up, 30, 0, 10, 10, upItem)
+            FocusableBox(left, 0, 30, 10, 10, leftItem)
+            FocusableBox(parent, 20, 20, 30, 30, modifier = customFocusExit) {
+                FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+            }
+            FocusableBox(right, 60, 30, 10, 10, rightItem)
+            FocusableBox(down, 30, 60, 10, 10, downItem)
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(up.value).isFalse()
+            assertThat(left.value).isFalse()
+            assertThat(right.value).isFalse()
+            assertThat(down.value).isFalse()
+            assertThat(focusedItem.value).isTrue()
+        }
+    }
+
+    /**
+     *                      _________
+     *                     |   Up   |
+     *                     |________|
+     *               _________________________
+     *              | grandparent            |
+     *              |  _____________________ |
+     *              | | parent             | |
+     *   _________  | |     _________      | |  _________
+     *  |  Left  |  | |    | source |      | | |  Right |
+     *  |________|  | |    |________|      | | |________|
+     *              | |____________________| |
+     *              |________________________|
+     *                      _________
+     *                     |  Down  |
+     *                     |________|
+     */
+    @OptIn(ExperimentalFoundationApi::class)
+    @Test
+    fun moveFocusExit_multipleParents_cancelExit() {
+        // Arrange.
+        val (grandparent, parent) = List(4) { mutableStateOf(false) }
+        val (up, down, left, right) = List(4) { mutableStateOf(false) }
+        var (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
+
+        val customFocusExit = Modifier
+            .focusProperties { exit = { Cancel } }
+            .focusGroup()
+
+        rule.setContentForTest {
+            FocusableBox(up, 40, 0, 10, 10, upItem)
+            FocusableBox(left, 0, 40, 10, 10, leftItem)
+            FocusableBox(grandparent, 20, 20, 50, 50, modifier = Modifier.focusGroup()) {
+                FocusableBox(parent, 10, 10, 30, 30, modifier = customFocusExit) {
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+                }
+            }
+            FocusableBox(right, 80, 40, 10, 10, rightItem)
+            FocusableBox(down, 40, 80, 10, 10, downItem)
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(up.value).isFalse()
+            assertThat(left.value).isFalse()
+            assertThat(right.value).isFalse()
+            assertThat(down.value).isFalse()
+            assertThat(focusedItem.value).isTrue()
+        }
+    }
+
+    /**
+     *   _________            _________
+     *  |  dest  |           |   Up   |
+     *  |________|           |________|
+     *                  _____________________
+     *                 | grandparent+parent |
+     *   _________     |      _________     |    _________
+     *  |  Left  |     |     | source |     |   |  Right |
+     *  |________|     |     |________|     |   |________|
+     *                 |____________________|
+     *                        _________
+     *                       |  Down  |
+     *                       |________|
+     */
+    @OptIn(ExperimentalFoundationApi::class)
+    @Test
+    fun moveFocusExit_multipleParents_redirectExit() {
+        // Arrange.
+        val destItem = FocusRequester()
+        val (dest, grandparent, parent) = List(4) { mutableStateOf(false) }
+        val (up, down, left, right) = List(4) { mutableStateOf(false) }
+        var (upItem, downItem, leftItem, rightItem) = FocusRequester.createRefs()
+
+        val customFocusExit = Modifier
+            .focusGroup()
+            .focusProperties {
+                exit = {
+                    initialFocus.requestFocus()
+                    Cancel
+                }
+            }
+            .focusGroup()
+
+        rule.setContentForTest {
+            FocusableBox(dest, 0, 0, 10, 10, destItem)
+            FocusableBox(up, 40, 0, 10, 10, upItem)
+            FocusableBox(left, 0, 40, 10, 10, leftItem)
+            FocusableBox(grandparent, 20, 20, 50, 50, modifier = Modifier.focusGroup()) {
+                FocusableBox(parent, 10, 10, 30, 30, modifier = customFocusExit) {
+                    FocusableBox(focusedItem, 10, 10, 10, 10, initialFocus)
+                }
+            }
+            FocusableBox(right, 80, 40, 10, 10, rightItem)
+            FocusableBox(down, 40, 80, 10, 10, downItem)
+        }
+
+        // Act.
+        val movedFocusSuccessfully = rule.runOnIdle { focusManager.moveFocus(focusDirection) }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(movedFocusSuccessfully).isFalse()
+            assertThat(up.value).isFalse()
+            assertThat(left.value).isFalse()
+            assertThat(right.value).isFalse()
+            assertThat(down.value).isFalse()
+            assertThat(focusedItem.value).isTrue()
+        }
+    }
+
     // We need to wrap the inline class parameter in another class because Java can't instantiate
     // the inline class.
     class Param(val focusDirection: FocusDirection) {
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/input/TextInputServiceAndroidEmojiTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
index b0c3d03..118d446 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidEmojiTest.kt
@@ -16,13 +16,16 @@
 
 package androidx.compose.ui.input
 
+import android.view.Choreographer
 import android.view.View
 import android.view.inputmethod.EditorInfo
 import androidx.compose.ui.text.input.ImeOptions
 import androidx.compose.ui.text.input.InputMethodManager
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.TextInputServiceAndroid
+import androidx.compose.ui.text.input.asExecutor
 import androidx.emoji2.text.EmojiCompat
+import androidx.test.espresso.Espresso
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -47,7 +50,10 @@
         EmojiCompat.reset(e2)
         val view = View(InstrumentationRegistry.getInstrumentation().context)
         val inputMethodManager = mock<InputMethodManager>()
-        val textInputService = TextInputServiceAndroid(view, inputMethodManager)
+        // Choreographer must be retrieved on main thread.
+        val choreographer = Espresso.onIdle { Choreographer.getInstance() }
+        val textInputService =
+            TextInputServiceAndroid(view, inputMethodManager, choreographer.asExecutor())
 
         textInputService.startInput(TextFieldValue(""), ImeOptions.Default, {}, {})
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
index 94300f6..047d3ee 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TextInputServiceAndroidOnStateUpdateTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.input
 
+import android.view.Choreographer
 import android.view.View
 import android.view.inputmethod.EditorInfo
 import androidx.compose.ui.text.TextRange
@@ -24,6 +25,8 @@
 import androidx.compose.ui.text.input.RecordingInputConnection
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.TextInputServiceAndroid
+import androidx.compose.ui.text.input.asExecutor
+import androidx.test.espresso.Espresso
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -51,7 +54,10 @@
     fun setup() {
         val view = View(InstrumentationRegistry.getInstrumentation().context)
         inputMethodManager = mock()
-        textInputService = TextInputServiceAndroid(view, inputMethodManager)
+        // Choreographer must be retrieved on main thread.
+        val choreographer = Espresso.onIdle { Choreographer.getInstance() }
+        textInputService =
+            TextInputServiceAndroid(view, inputMethodManager, choreographer.asExecutor())
         textInputService.startInput(
             value = TextFieldValue(""),
             imeOptions = ImeOptions.Default,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
index 30f35ea..e4256b6 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/focus/FocusAwareEventPropagationTest.kt
@@ -32,7 +32,8 @@
 import androidx.compose.ui.input.key.KeyInputInputModifierNodeImpl
 import androidx.compose.ui.input.rotary.RotaryInputModifierNodeImpl
 import androidx.compose.ui.input.rotary.RotaryScrollEvent
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.SemanticsNodeInteraction
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -42,7 +43,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -50,10 +51,6 @@
 
 /**
  * Focus-aware event propagation test.
- *
- * This test verifies the event propagation logic using
- * [androidx.compose.ui.input.rotary.RotaryScrollEvent]s, but it is meant to test the generic
- * propagation logic for all focus-aware events.
  */
 @MediumTest
 @RunWith(Parameterized::class)
@@ -76,6 +73,12 @@
         fun initParameters() = arrayOf(KeyInput, RotaryInput)
     }
 
+    @Before
+    fun ignoreEventTime() {
+        // This test just checks the propagation of events and doesn't care about the event time.
+        rule.mainClock.autoAdvance = false
+    }
+
     @Test
     fun noFocusable_doesNotDeliverEvent() {
         // Arrange.
@@ -183,7 +186,6 @@
         }
     }
 
-    @Ignore("b/265319988")
     @Test
     fun onFocusAwareEvent_isTriggered() {
         // Arrange.
@@ -205,7 +207,6 @@
         rule.runOnIdle { assertThat(sentEvent).isEqualTo(receivedEvent) }
     }
 
-    @Ignore("b/264466323")
     @Test
     fun onPreFocusAwareEvent_triggered() {
         // Arrange.
@@ -279,7 +280,6 @@
         }
     }
 
-    @Ignore // b/266984867
     @Test
     fun onPreFocusAwareEvent_triggeredBefore_onFocusAwareEvent_1() {
         // Arrange.
@@ -530,54 +530,47 @@
     }
 
     private fun Modifier.onFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier = this.then(
-        @OptIn(ExperimentalComposeUiApi::class)
-        when (nodeType) {
-            KeyInput -> modifierElementOf(
-                key = onEvent,
-                create = { KeyInputInputModifierNodeImpl(onEvent = onEvent, onPreEvent = null) },
-                update = { it.onEvent = onEvent },
-                definitions = {
-                    name = "onEvent"
-                    properties["onEvent"] = onEvent
-                }
-            )
-
-            RotaryInput -> modifierElementOf(
-                key = onEvent,
-                create = { RotaryInputModifierNodeImpl(onEvent = onEvent, onPreEvent = null) },
-                update = { it.onEvent = onEvent },
-                definitions = {
-                    name = "onEvent"
-                    properties["onEvent"] = onEvent
-                }
-            )
-        }
+        FocusAwareEventElement(onEvent, nodeType, EventType.OnEvent)
     )
 
     private fun Modifier.onPreFocusAwareEvent(onEvent: (Any) -> Boolean): Modifier = this.then(
-        @OptIn(ExperimentalComposeUiApi::class)
-        when (nodeType) {
-            KeyInput -> modifierElementOf(
-                key = onEvent,
-                create = { KeyInputInputModifierNodeImpl(onEvent = null, onPreEvent = onEvent) },
-                update = { it.onEvent = onEvent },
-                definitions = {
-                    name = "onEvent"
-                    properties["onEvent"] = onEvent
-                }
-            )
-
-            RotaryInput -> modifierElementOf(
-                key = onEvent,
-                create = { RotaryInputModifierNodeImpl(onEvent = null, onPreEvent = onEvent) },
-                update = { it.onEvent = onEvent },
-                definitions = {
-                    name = "onEvent"
-                    properties["onEvent"] = onEvent
-                }
-            )
-        }
+        FocusAwareEventElement(onEvent, nodeType, EventType.PreEvent)
     )
 
+    @OptIn(ExperimentalComposeUiApi::class)
+    private data class FocusAwareEventElement(
+        private val callback: (Any) -> Boolean,
+        private val nodeType: NodeType,
+        private val eventType: EventType
+    ) : ModifierNodeElement<Modifier.Node>() {
+        override fun create() = when (nodeType) {
+            KeyInput -> KeyInputInputModifierNodeImpl(
+                onEvent = callback.takeIf { eventType == EventType.OnEvent },
+                onPreEvent = callback.takeIf { eventType == EventType.PreEvent }
+            )
+            RotaryInput -> RotaryInputModifierNodeImpl(
+                onEvent = callback.takeIf { eventType == EventType.OnEvent },
+                onPreEvent = callback.takeIf { eventType == EventType.PreEvent }
+            )
+        }
+
+        override fun update(node: Modifier.Node) = when (nodeType) {
+            KeyInput -> (node as KeyInputInputModifierNodeImpl).apply {
+                onEvent = callback.takeIf { eventType == EventType.OnEvent }
+                onPreEvent = callback.takeIf { eventType == EventType.PreEvent }
+            }
+            RotaryInput -> (node as RotaryInputModifierNodeImpl).apply {
+                onEvent = callback.takeIf { eventType == EventType.OnEvent }
+                onPreEvent = callback.takeIf { eventType == EventType.PreEvent }
+            }
+        }
+
+        override fun InspectorInfo.inspectableProperties() {
+            name = "onEvent"
+            properties["onEvent"] = callback
+        }
+    }
+
     enum class NodeType { KeyInput, RotaryInput }
+    enum class EventType { PreEvent, OnEvent }
 }
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
index 1352f5f..2084e71 100644
--- 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
@@ -36,7 +36,6 @@
 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
@@ -537,30 +536,36 @@
     onDetach: () -> Unit = {},
     onAttach: () -> Unit = {},
 ): Modifier {
-    return modifierElementOf(
-        key = key,
-        create = {
+    class GenericModifierWithLifecycle(
+        val key: Any?
+    ) : ModifierNodeElement<Modifier.Node>() {
+        override fun create(): Modifier.Node {
             onCreate()
-            object : Modifier.Node() {
+            return object : Modifier.Node() {
                 override fun onReset() = onReset()
                 override fun onAttach() = onAttach()
                 override fun onDetach() = onDetach()
-                }
-        },
-        update = {
-            onUpdate()
+            }
         }
-    ) {}
+
+        override fun update(node: Modifier.Node) = node.apply { onUpdate() }
+
+        override fun hashCode(): Int = "ModifierNodeReuseAndDeactivationTest".hashCode()
+
+        override fun equals(other: Any?) = (other === this) ||
+            (other is GenericModifierWithLifecycle && other.key == this.key)
+    }
+    return GenericModifierWithLifecycle(key)
 }
 
 private val MeasurePolicy = MeasurePolicy { _, _ ->
     layout(100, 100) { }
 }
 
-private class StatelessModifierElement(
+private data class StatelessModifierElement(
     private val onInvalidate: () -> Unit,
     private val size: Int = 10
-) : ModifierNodeElement<StatelessModifierElement.Node>(params = size, inspectorInfo = {}) {
+) : ModifierNodeElement<StatelessModifierElement.Node>() {
     override fun create() = Node(size, onInvalidate)
 
     override fun update(node: Node) = node.also {
@@ -582,9 +587,9 @@
     }
 }
 
-private class DelegatingModifierElement(
+private data class DelegatingModifierElement(
     private val onDelegatedNodeReset: () -> Unit,
-) : ModifierNodeElement<DelegatingModifierElement.Node>(inspectorInfo = {}) {
+) : ModifierNodeElement<DelegatingModifierElement.Node>() {
     override fun create() = Node(onDelegatedNodeReset)
 
     override fun update(node: Node) = node.also {
@@ -602,9 +607,9 @@
     }
 }
 
-private class LayerModifierElement(
+private data class LayerModifierElement(
     private val layerBlock: () -> Unit,
-) : ModifierNodeElement<LayerModifierElement.Node>(inspectorInfo = {}) {
+) : ModifierNodeElement<LayerModifierElement.Node>() {
     override fun create() = Node(layerBlock)
 
     override fun update(node: Node) = node.also {
@@ -626,9 +631,9 @@
     }
 }
 
-private class ObserverModifierElement(
+private data class ObserverModifierElement(
     private val observedBlock: () -> Unit,
-) : ModifierNodeElement<ObserverModifierElement.Node>(inspectorInfo = {}) {
+) : ModifierNodeElement<ObserverModifierElement.Node>() {
     override fun create() = Node(observedBlock)
 
     override fun update(node: Node) = node.also {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/DelegatableNodeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/DelegatableNodeTest.kt
index f228f88..081c512 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/DelegatableNodeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/DelegatableNodeTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusTargetModifierNode
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -605,10 +606,18 @@
 
     private fun Modifier.otherModifier(): Modifier = this.then(Modifier)
 
-    @Suppress("ModifierInspectorInfo") // b/251831790.
-    @ExperimentalComposeUiApi
-    private inline fun <reified T : Modifier.Node> modifierElementOf(crossinline create: () -> T) =
-        modifierElementOf(create) { name = "testNode" }
+    private inline fun <reified T : Modifier.Node> modifierElementOf(noinline create: () -> T) =
+        ModifierElementOf(create)
+
+    private data class ModifierElementOf<T : Modifier.Node>(
+        val factory: () -> T
+    ) : ModifierNodeElement<T>() {
+        override fun create(): T = factory()
+        override fun update(node: T) = node
+        override fun InspectorInfo.inspectableProperties() {
+            name = "testNode"
+        }
+    }
 
     private class DetachableNode(val onDetach: (DetachableNode) -> Unit) : Modifier.Node() {
         override fun onDetach() {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
index 7bc20da..ad0f352 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/InvalidateSubtreeTest.kt
@@ -26,7 +26,7 @@
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.dp
@@ -50,16 +50,9 @@
         val counter1 = LayoutAndDrawCounter()
         val counter2 = LayoutAndDrawCounter()
         val counter3 = LayoutAndDrawCounter()
-        val captureInvalidate = modifierElementOf(
-            create = {
-                val obj = object : Modifier.Node() {}
-                invalidate = { obj.invalidateSubtree() }
-                obj
-            },
-            definitions = debugInspectorInfo {
-                name = "Invalidate Subtree Modifier.Node"
-            }
-        )
+        val captureInvalidate = CaptureInvalidateCounter { node ->
+            invalidate = { node.invalidateSubtree() }
+        }
         rule.setContent {
             Box(counter1) {
                 Box(counter2 then captureInvalidate) {
@@ -102,16 +95,9 @@
         val counter2 = LayoutAndDrawCounter()
         val counter3 = LayoutAndDrawCounter()
         val counter4 = LayoutAndDrawCounter()
-        val captureInvalidate = modifierElementOf(
-            create = {
-                val obj = object : Modifier.Node() {}
-                invalidate = { obj.invalidateSubtree() }
-                obj
-            },
-            definitions = debugInspectorInfo {
-                name = "Invalidate Subtree Modifier.Node"
-            }
-        )
+        val captureInvalidate = CaptureInvalidateCounter { node ->
+            invalidate = { node.invalidateSubtree() }
+        }
         rule.setContent {
             Box(Modifier.graphicsLayer {} then counter1.graphicsLayer { }) {
                 Box(Modifier.graphicsLayer { } then
@@ -159,4 +145,20 @@
             drawContent()
         }
     }
+
+    private class CaptureInvalidateCounter(
+        private val onCreate: (node: Modifier.Node) -> Unit
+    ) : ModifierNodeElement<Modifier.Node>() {
+        override fun create() = object : Modifier.Node() {}
+            .apply<Modifier.Node>(onCreate)
+
+        override fun update(node: Modifier.Node) = node
+
+        override fun InspectorInfo.inspectableProperties() {
+            name = "Invalidate Subtree Modifier.Node"
+        }
+
+        override fun hashCode() = 0
+        override fun equals(other: Any?) = (other === this)
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
index 5694bd1..29cafc1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/NodeChainTester.kt
@@ -20,6 +20,8 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.InspectorInfo
+import com.google.common.base.Objects
 import org.junit.Assert
 
 internal fun chainTester() = NodeChainTester()
@@ -213,11 +215,7 @@
 }
 
 fun modifierA(params: Any? = null): Modifier.Element {
-    return object : ModifierNodeElement<A>(params, true, {}) {
-        override fun create(): A = A()
-        override fun update(node: A): A = node
-        override fun toString(): String = "a"
-    }
+    return object : TestModifierElement<A>("a", params, A()) {}
 }
 
 class B : Modifier.Node() {
@@ -225,11 +223,7 @@
 }
 
 fun modifierB(params: Any? = null): Modifier.Element {
-    return object : ModifierNodeElement<B>(params, true, {}) {
-        override fun create(): B = B()
-        override fun update(node: B): B = node
-        override fun toString(): String = "b"
-    }
+    return object : TestModifierElement<B>("b", params, B()) {}
 }
 
 class C : Modifier.Node() {
@@ -237,31 +231,44 @@
 }
 
 fun modifierC(params: Any? = null): Modifier.Element {
-    return object : ModifierNodeElement<C>(params, true, {}) {
-        override fun create(): C = C()
-        override fun update(node: C): C = node
-        override fun toString(): String = "c"
-    }
+    return object : TestModifierElement<C>("c", params, C()) {}
 }
 
 fun modifierD(params: Any? = null): Modifier.Element {
-    class N : Modifier.Node() {
-        override fun toString(): String = "d"
-    }
-    return object : ModifierNodeElement<N>(params, true, {}) {
-        override fun create(): N = N()
-        override fun update(node: N): N = node
-        override fun toString(): String = "d"
-    }
+    return object : TestModifierElement<Modifier.Node>("d", params,
+        object : Modifier.Node() {}
+    ) {}
 }
 
 fun managedModifier(
     name: String,
     params: Any? = null
-): ModifierNodeElement<*> = object : ModifierNodeElement<Modifier.Node>(params, true, {}) {
-    override fun create(): Modifier.Node = object : Modifier.Node() {}
-    override fun update(node: Modifier.Node): Modifier.Node = node
-    override fun toString(): String = name
+): ModifierNodeElement<*> = object : TestModifierElement<Modifier.Node>(name, params,
+    object : Modifier.Node() {}
+) {}
+
+private abstract class TestModifierElement<T : Modifier.Node>(
+    val modifierName: String,
+    val param: Any? = null,
+    val node: T
+) : ModifierNodeElement<T>() {
+    override fun create(): T = node
+    override fun update(node: T): T = this.node
+    override fun InspectorInfo.inspectableProperties() {
+        name = modifierName
+    }
+
+    override fun hashCode() = Objects.hashCode(modifierName, param)
+
+    override fun equals(other: Any?): Boolean {
+        if (other === this) return true
+        return other is TestModifierElement<*> &&
+            javaClass == other.javaClass &&
+            modifierName == other.modifierName &&
+            param == other.param
+    }
+
+    override fun toString() = modifierName
 }
 
 fun entityModifiers(vararg names: String): List<ModifierNodeElement<*>> {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/ObserverNodeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/ObserverNodeTest.kt
index d6ceb13..1049aaf 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/ObserverNodeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/ObserverNodeTest.kt
@@ -22,6 +22,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -162,7 +163,17 @@
 
     @ExperimentalComposeUiApi
     private inline fun <reified T : Modifier.Node> Modifier.modifierElementOf(node: T): Modifier {
-        return this.then(modifierElementOf(create = { node }, definitions = { name = "testNode" }))
+        return this then ModifierElementOf(node)
+    }
+
+    private data class ModifierElementOf<T : Modifier.Node>(
+        val node: T
+    ) : ModifierNodeElement<T>() {
+        override fun create(): T = node
+        override fun update(node: T) = this.node
+        override fun InspectorInfo.inspectableProperties() {
+            name = "testNode"
+        }
     }
 
     class TestObserverNode(
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..26442ef 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
@@ -1081,18 +1081,6 @@
     }
 
     /**
-     * Android has an issue where calling showSoftwareKeyboard after calling
-     * hideSoftwareKeyboard, it results in keyboard flickering and sometimes the keyboard ends up
-     * being hidden even though the most recent call was to showKeyboard.
-     *
-     * This function starts a suspended function that listens for show/hide commands and only
-     * runs the latest command.
-     */
-    suspend fun keyboardVisibilityEventLoop() {
-        textInputServiceAndroid.textInputCommandEventLoop()
-    }
-
-    /**
      * Walks the entire LayoutNode sub-hierarchy and marks all nodes as needing measurement.
      */
     private fun invalidateLayoutNodeMeasurement(node: LayoutNode) {
@@ -1159,6 +1147,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/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
index f8f95fc..90aafa5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.android.kt
@@ -150,7 +150,6 @@
                             currentComposer.collectParameterInformation()
                         }
 
-                        LaunchedEffect(owner) { owner.keyboardVisibilityEventLoop() }
                         LaunchedEffect(owner) { owner.boundsUpdatesEventLoop() }
 
                         CompositionLocalProvider(LocalInspectionTables provides inspectionTable) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
index c91311e..fd63e3f0 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
@@ -19,11 +19,13 @@
 import android.graphics.Rect as AndroidRect
 import android.text.InputType
 import android.util.Log
+import android.view.Choreographer
 import android.view.KeyEvent
 import android.view.View
 import android.view.inputmethod.BaseInputConnection
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputConnection
+import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.TextInputServiceAndroid.TextInputCommand.HideKeyboard
@@ -33,22 +35,26 @@
 import androidx.core.view.inputmethod.EditorInfoCompat
 import androidx.emoji2.text.EmojiCompat
 import java.lang.ref.WeakReference
+import java.util.concurrent.Executor
 import kotlin.math.roundToInt
-import kotlinx.coroutines.channels.Channel
 
 private const val DEBUG_CLASS = "TextInputServiceAndroid"
 
 /**
  * Provide Android specific input service with the Operating System.
+ *
+ * @param inputCommandProcessorExecutor [Executor] used to schedule the [processInputCommands]
+ * function when a input command is first requested for a frame.
  */
 internal class TextInputServiceAndroid(
     val view: View,
-    private val inputMethodManager: InputMethodManager
+    private val inputMethodManager: InputMethodManager,
+    private val inputCommandProcessorExecutor: Executor = Choreographer.getInstance().asExecutor(),
 ) : PlatformTextInputService {
 
     /**
-     * Commands that can be sent into [textInputCommandChannel] to be processed by
-     * [textInputCommandEventLoop].
+     * Commands that can be sent into [textInputCommandQueue] to be processed by
+     * [processInputCommands].
      */
     private enum class TextInputCommand {
         StartInput,
@@ -92,9 +98,10 @@
      * A channel that is used to debounce rapid operations such as showing/hiding the keyboard and
      * starting/stopping input, so we can make the minimal number of calls on the
      * [inputMethodManager]. The [TextInputCommand]s sent to this channel are processed by
-     * [textInputCommandEventLoop].
+     * [processInputCommands].
      */
-    private val textInputCommandChannel = Channel<TextInputCommand>(Channel.UNLIMITED)
+    private val textInputCommandQueue = mutableVectorOf<TextInputCommand>()
+    private var frameCallback: Runnable? = null
 
     internal constructor(view: View) : this(view, InputMethodManagerImpl(view))
 
@@ -171,7 +178,7 @@
 
         // Don't actually send the command to the IME yet, it may be overruled by a subsequent call
         // to stopInput.
-        textInputCommandChannel.trySend(StartInput)
+        sendInputCommand(StartInput)
     }
 
     override fun stopInput() {
@@ -184,129 +191,129 @@
 
         // Don't actually send the command to the IME yet, it may be overruled by a subsequent call
         // to startInput.
-        textInputCommandChannel.trySend(StopInput)
+        sendInputCommand(StopInput)
     }
 
     override fun showSoftwareKeyboard() {
         if (DEBUG) {
             Log.d(TAG, "$DEBUG_CLASS.showSoftwareKeyboard")
         }
-        textInputCommandChannel.trySend(ShowKeyboard)
+        sendInputCommand(ShowKeyboard)
     }
 
     override fun hideSoftwareKeyboard() {
         if (DEBUG) {
             Log.d(TAG, "$DEBUG_CLASS.hideSoftwareKeyboard")
         }
-        textInputCommandChannel.trySend(HideKeyboard)
+        sendInputCommand(HideKeyboard)
     }
 
-    /**
-     * Processes commands from the [textInputCommandChannel] to make the appropriate calls on the
-     * [inputMethodManager].
-     */
-    suspend fun textInputCommandEventLoop() {
-        // TODO(b/180071033): Allow for more IMPLICIT flag to be passed.
-        for (initialCommand in textInputCommandChannel) {
-            // When focus changes to a non-Compose view, the system will take care of managing the
-            // keyboard (via ImeFocusController) so we don't need to do anything. This can happen
-            // when a Compose text field is focused, then the user taps on an EditText view.
-            // And any commands that come in while we're not focused should also just be ignored,
-            // since no unfocused view should be messing with the keyboard.
-            // TODO(b/215761849) When focus moves to a different ComposeView than this one, this
-            //  logic doesn't work and the keyboard is not hidden.
-            if (!view.isFocused) {
-                // All queued commands should be ignored, so drain them out of the channel to avoid
-                // waking up this coroutine again immediately.
-                do {
-                    val command = textInputCommandChannel.tryReceive()
-                } while (command.isSuccess)
-                continue
-            }
-
-            // Multiple commands may have been queued up in the channel while this function was
-            // waiting to be resumed. We don't execute the commands as they come in because making a
-            // bunch of calls to change the actual IME quickly can result in flickers. Instead, we
-            // manually coalesce the commands to figure out the minimum number of IME operations we
-            // need to get to the desired final state.
-            // The queued commands effectively operate on a simple state machine consisting of two
-            // flags:
-            //   1. Whether to start a new input connection (true), tear down the input connection
-            //      (false), or leave the current connection as-is (null).
-            var startInput: Boolean? = null
-            //   2. Whether to show the keyboard (true), hide the keyboard (false), or leave the
-            //      keyboard visibility as-is (null).
-            var showKeyboard: Boolean? = null
-
-            // And a function that performs the appropriate state transition given a command.
-            fun TextInputCommand.applyToState() {
-                when (this) {
-                    StartInput -> {
-                        // Any commands before restarting the input are meaningless since they would
-                        // apply to the connection we're going to tear down and recreate.
-                        // Starting a new connection implicitly stops the previous connection.
-                        startInput = true
-                        // It doesn't make sense to start a new connection without the keyboard
-                        // showing.
-                        showKeyboard = true
-                    }
-                    StopInput -> {
-                        startInput = false
-                        // It also doesn't make sense to keep the keyboard visible if it's not
-                        // connected to anything. Note that this is different than the Android
-                        // default behavior for Views, which is to keep the keyboard showing even
-                        // after the view that the IME was shown for loses focus.
-                        // See this doc for some notes and discussion on whether we should auto-hide
-                        // or match Android:
-                        // https://docs.google.com/document/d/1o-y3NkfFPCBhfDekdVEEl41tqtjjqs8jOss6txNgqaw/edit?resourcekey=0-o728aLn51uXXnA4Pkpe88Q#heading=h.ieacosb5rizm
-                        showKeyboard = false
-                    }
-                    ShowKeyboard,
-                    HideKeyboard -> {
-                        // Any keyboard visibility commands sent after input is stopped but before
-                        // input is started should be ignored.
-                        // Otherwise, the last visibility command sent either before the last stop
-                        // command, or after the last start command, is the one that should take
-                        // effect.
-                        if (startInput != false) {
-                            showKeyboard = this == ShowKeyboard
-                        }
-                    }
-                }
-            }
-
-            // Feed all the queued commands into the state machine.
-            var command: TextInputCommand? = initialCommand
-            while (command != null) {
-                command.applyToState()
-                if (DEBUG) {
-                    Log.d(
-                        TAG,
-                        "$DEBUG_CLASS.textInputCommandEventLoop.$command " +
-                            "(startInput=$startInput, showKeyboard=$showKeyboard)"
-                    )
-                }
-                command = textInputCommandChannel.tryReceive().getOrNull()
-            }
-
-            // Now that we've calculated what operations we need to perform on the actual input
-            // manager, perform them.
-            // If the keyboard visibility was changed after starting a new connection, we need to
-            // perform that operation change after starting it.
-            // If the keyboard visibility was changed before closing the connection, we need to
-            // perform that operation before closing the connection so it doesn't no-op.
-            if (startInput == true) {
-                restartInputImmediately()
-            }
-            showKeyboard?.also(::setKeyboardVisibleImmediately)
-            if (startInput == false) {
-                restartInputImmediately()
-            }
-
-            if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.textInputCommandEventLoop.finished")
+    private fun sendInputCommand(command: TextInputCommand) {
+        textInputCommandQueue += command
+        if (frameCallback == null) {
+            frameCallback = Runnable {
+                frameCallback = null
+                processInputCommands()
+            }.also(inputCommandProcessorExecutor::execute)
         }
     }
 
+    private fun processInputCommands() {
+        // When focus changes to a non-Compose view, the system will take care of managing the
+        // keyboard (via ImeFocusController) so we don't need to do anything. This can happen
+        // when a Compose text field is focused, then the user taps on an EditText view.
+        // And any commands that come in while we're not focused should also just be ignored,
+        // since no unfocused view should be messing with the keyboard.
+        // TODO(b/215761849) When focus moves to a different ComposeView than this one, this
+        //  logic doesn't work and the keyboard is not hidden.
+        if (!view.isFocused) {
+            // All queued commands should be ignored.
+            textInputCommandQueue.clear()
+            return
+        }
+
+        // Multiple commands may have been queued up in the channel while this function was
+        // waiting to be resumed. We don't execute the commands as they come in because making a
+        // bunch of calls to change the actual IME quickly can result in flickers. Instead, we
+        // manually coalesce the commands to figure out the minimum number of IME operations we
+        // need to get to the desired final state.
+        // The queued commands effectively operate on a simple state machine consisting of two
+        // flags:
+        //   1. Whether to start a new input connection (true), tear down the input connection
+        //      (false), or leave the current connection as-is (null).
+        var startInput: Boolean? = null
+        //   2. Whether to show the keyboard (true), hide the keyboard (false), or leave the
+        //      keyboard visibility as-is (null).
+        var showKeyboard: Boolean? = null
+
+        // And a function that performs the appropriate state transition given a command.
+        fun TextInputCommand.applyToState() {
+            when (this) {
+                StartInput -> {
+                    // Any commands before restarting the input are meaningless since they would
+                    // apply to the connection we're going to tear down and recreate.
+                    // Starting a new connection implicitly stops the previous connection.
+                    startInput = true
+                    // It doesn't make sense to start a new connection without the keyboard
+                    // showing.
+                    showKeyboard = true
+                }
+
+                StopInput -> {
+                    startInput = false
+                    // It also doesn't make sense to keep the keyboard visible if it's not
+                    // connected to anything. Note that this is different than the Android
+                    // default behavior for Views, which is to keep the keyboard showing even
+                    // after the view that the IME was shown for loses focus.
+                    // See this doc for some notes and discussion on whether we should auto-hide
+                    // or match Android:
+                    // https://docs.google.com/document/d/1o-y3NkfFPCBhfDekdVEEl41tqtjjqs8jOss6txNgqaw/edit?resourcekey=0-o728aLn51uXXnA4Pkpe88Q#heading=h.ieacosb5rizm
+                    showKeyboard = false
+                }
+
+                ShowKeyboard,
+                HideKeyboard -> {
+                    // Any keyboard visibility commands sent after input is stopped but before
+                    // input is started should be ignored.
+                    // Otherwise, the last visibility command sent either before the last stop
+                    // command, or after the last start command, is the one that should take
+                    // effect.
+                    if (startInput != false) {
+                        showKeyboard = this == ShowKeyboard
+                    }
+                }
+            }
+        }
+
+        // Feed all the queued commands into the state machine.
+        textInputCommandQueue.forEach { command ->
+            command.applyToState()
+            if (DEBUG) {
+                Log.d(
+                    TAG,
+                    "$DEBUG_CLASS.textInputCommandEventLoop.$command " +
+                        "(startInput=$startInput, showKeyboard=$showKeyboard)"
+                )
+            }
+        }
+
+        // Now that we've calculated what operations we need to perform on the actual input
+        // manager, perform them.
+        // If the keyboard visibility was changed after starting a new connection, we need to
+        // perform that operation change after starting it.
+        // If the keyboard visibility was changed before closing the connection, we need to
+        // perform that operation before closing the connection so it doesn't no-op.
+        if (startInput == true) {
+            restartInputImmediately()
+        }
+        showKeyboard?.also(::setKeyboardVisibleImmediately)
+        if (startInput == false) {
+            restartInputImmediately()
+        }
+
+        if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.textInputCommandEventLoop.finished")
+    }
+
     override fun updateState(oldValue: TextFieldValue?, newValue: TextFieldValue) {
         if (DEBUG) {
             Log.d(TAG, "$DEBUG_CLASS.updateState called: $oldValue -> $newValue")
@@ -382,13 +389,13 @@
         }
     }
 
-    /** Immediately restart the IME connection, bypassing the [textInputCommandChannel]. */
+    /** Immediately restart the IME connection, bypassing the [textInputCommandQueue]. */
     private fun restartInputImmediately() {
         if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.restartInputImmediately")
         inputMethodManager.restartInput()
     }
 
-    /** Immediately show or hide the keyboard, bypassing the [textInputCommandChannel]. */
+    /** Immediately show or hide the keyboard, bypassing the [textInputCommandQueue]. */
     private fun setKeyboardVisibleImmediately(visible: Boolean) {
         if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.setKeyboardVisibleImmediately(visible=$visible)")
         if (visible) {
@@ -500,4 +507,8 @@
     this.imeOptions = this.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
 }
 
+internal fun Choreographer.asExecutor(): Executor = Executor { runnable ->
+    postFrameCallback { runnable.run() }
+}
+
 private fun hasFlag(bits: Int, flag: Int): Boolean = (bits and flag) == flag
\ No newline at end of file
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 99859f7..a3f8e91 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
@@ -146,7 +146,6 @@
      * [Modifier.Node] subclass, it is expected that it will be instantiated by adding a
      * [androidx.compose.ui.node.ModifierNodeElement] to a [Modifier] chain.
      *
-     * @see androidx.compose.ui.node.modifierElementOf
      * @see androidx.compose.ui.node.ModifierNodeElement
      * @see androidx.compose.ui.node.DelegatableNode
      * @see androidx.compose.ui.node.DelegatingNode
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
index 01c13da..555e30e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/DrawModifier.kt
@@ -29,7 +29,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 import androidx.compose.ui.node.DrawModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * A [Modifier.Element] that draws into the space of the layout.
@@ -84,25 +85,25 @@
 /**
  * Draw into a [Canvas] behind the modified content.
  */
-@OptIn(ExperimentalComposeUiApi::class)
 fun Modifier.drawBehind(
     onDraw: DrawScope.() -> Unit
-) = this.then(
-    modifierElementOf(
-        key = onDraw,
-        create = {
-            DrawBackgroundModifier(onDraw = onDraw)
-        },
-        update = {
-            it.onDraw = onDraw
-        },
-        definitions = debugInspectorInfo {
-            name = "drawBehind"
-            properties["onDraw"] = onDraw
-        }
-    )
+) = this then DrawBehindElement(onDraw)
 
-)
+@OptIn(ExperimentalComposeUiApi::class)
+private data class DrawBehindElement(
+    val onDraw: DrawScope.() -> Unit
+) : ModifierNodeElement<DrawBackgroundModifier>() {
+    override fun create() = DrawBackgroundModifier(onDraw)
+
+    override fun update(node: DrawBackgroundModifier) = node.apply {
+        onDraw = this@DrawBehindElement.onDraw
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "drawBehind"
+        properties["onDraw"] = onDraw
+    }
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class DrawBackgroundModifier(
@@ -243,27 +244,25 @@
  * Creates a [DrawModifier] that allows the developer to draw before or after the layout's
  * contents. It also allows the modifier to adjust the layout's canvas.
  */
-@OptIn(ExperimentalComposeUiApi::class)
 fun Modifier.drawWithContent(
     onDraw: ContentDrawScope.() -> Unit
-): Modifier = this.then(
-    modifierElementOf(
-        key = onDraw,
-        create = {
-            DrawWithContentModifier(
-                onDraw = onDraw
-            )
-        },
-        update = {
-            it.onDraw = onDraw
-        },
-        definitions = debugInspectorInfo {
-            name = "drawWithContent"
-            properties["onDraw"] = onDraw
-        }
-    )
+): Modifier = this then DrawWithContentElement(onDraw)
 
-)
+@OptIn(ExperimentalComposeUiApi::class)
+private data class DrawWithContentElement(
+    val onDraw: ContentDrawScope.() -> Unit
+) : ModifierNodeElement<DrawWithContentModifier>() {
+    override fun create() = DrawWithContentModifier(onDraw)
+
+    override fun update(node: DrawWithContentModifier) = node.apply {
+        onDraw = this@DrawWithContentElement.onDraw
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "drawWithContent"
+        properties["onDraw"] = onDraw
+    }
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class DrawWithContentModifier(
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..4b3bbd9 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,12 +31,15 @@
 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.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.InspectorInfo
-import androidx.compose.ui.platform.InspectorValueInfo
-import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.constrainHeight
@@ -54,6 +58,7 @@
  *
  * @sample androidx.compose.ui.samples.PainterModifierSample
  */
+@OptIn(ExperimentalComposeUiApi::class)
 fun Modifier.paint(
     painter: Painter,
     sizeToIntrinsics: Boolean = true,
@@ -61,39 +66,101 @@
     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 data class PainterModifierNodeElement(
+    val painter: Painter,
+    val sizeToIntrinsics: Boolean,
+    val alignment: Alignment,
+    val contentScale: ContentScale,
+    val alpha: Float,
+    val colorFilter: ColorFilter?
+) : ModifierNodeElement<PainterModifierNode>() {
+    override val autoInvalidate: Boolean
+        get() = false
+
+    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 InspectorInfo.inspectableProperties() {
+        name = "paint"
+        properties["painter"] = painter
+        properties["sizeToIntrinsics"] = sizeToIntrinsics
+        properties["alignment"] = alignment
+        properties["contentScale"] = contentScale
+        properties["alpha"] = alpha
+        properties["colorFilter"] = colorFilter
+    }
+}
+
+/**
  * [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 +356,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/FocusChangedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
index 5c4c835..49f428d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusChangedModifier.kt
@@ -18,7 +18,8 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * Add this modifier to a component to observe focus state events. [onFocusChanged] is invoked
@@ -30,19 +31,25 @@
  * Note: If you want to be notified every time the internal focus state is written to (even if it
  * hasn't changed), use [onFocusEvent] instead.
  */
-@Suppress("ModifierInspectorInfo")
-fun Modifier.onFocusChanged(onFocusChanged: (FocusState) -> Unit): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    modifierElementOf(
-        key = onFocusChanged,
-        create = { FocusChangedModifierNode(onFocusChanged) },
-        update = { it.onFocusChanged = onFocusChanged },
-        definitions = {
-            name = "onFocusChanged"
-            properties["onFocusChanged"] = onFocusChanged
-        }
-    )
-)
+fun Modifier.onFocusChanged(
+    onFocusChanged: (FocusState) -> Unit
+): Modifier = this then FocusChangedElement(onFocusChanged)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class FocusChangedElement(
+    val onFocusChanged: (FocusState) -> Unit
+) : ModifierNodeElement<FocusChangedModifierNode>() {
+    override fun create() = FocusChangedModifierNode(onFocusChanged)
+
+    override fun update(node: FocusChangedModifierNode) = node.apply {
+        onFocusChanged = this@FocusChangedElement.onFocusChanged
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onFocusChanged"
+        properties["onFocusChanged"] = onFocusChanged
+    }
+}
 
 @ExperimentalComposeUiApi
 private class FocusChangedModifierNode(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
index 0b99f2a..f38261a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusEventModifier.kt
@@ -18,7 +18,8 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * A [modifier][Modifier.Element] that can be used to observe focus state events.
@@ -35,19 +36,25 @@
 /**
  * Add this modifier to a component to observe focus state events.
  */
-@Suppress("ModifierInspectorInfo") // b/251831790.
-fun Modifier.onFocusEvent(onFocusEvent: (FocusState) -> Unit): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    (modifierElementOf(
-        key = onFocusEvent,
-        create = { FocusEventModifierNodeImpl(onFocusEvent) },
-        update = { it.onFocusEvent = onFocusEvent },
-        definitions = {
-            name = "onFocusEvent"
-            properties["onFocusEvent"] = onFocusEvent
-        }
-    ))
-)
+fun Modifier.onFocusEvent(
+    onFocusEvent: (FocusState) -> Unit
+): Modifier = this then FocusEventElement(onFocusEvent)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class FocusEventElement(
+    val onFocusEvent: (FocusState) -> Unit
+) : ModifierNodeElement<FocusEventModifierNodeImpl>() {
+    override fun create() = FocusEventModifierNodeImpl(onFocusEvent)
+
+    override fun update(node: FocusEventModifierNodeImpl) = node.apply {
+        onFocusEvent = this@FocusEventElement.onFocusEvent
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onFocusEvent"
+        properties["onFocusEvent"] = onFocusEvent
+    }
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class FocusEventModifierNodeImpl(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
index d3119d9..d547117 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
@@ -31,12 +31,13 @@
 import androidx.compose.ui.input.key.KeyInputModifierNode
 import androidx.compose.ui.input.rotary.RotaryScrollEvent
 import androidx.compose.ui.node.DelegatableNode
+import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.node.NodeKind
 import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.node.ancestors
-import androidx.compose.ui.node.modifierElementOf
 import androidx.compose.ui.node.nearestAncestor
 import androidx.compose.ui.node.visitLocalChildren
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastForEachReversed
@@ -57,12 +58,20 @@
      * list that contains the modifiers required by the focus system. (Eg, a root focus modifier).
      */
     // TODO(b/168831247): return an empty Modifier when there are no focusable children.
-    @Suppress("ModifierInspectorInfo") // b/251831790.
     @OptIn(ExperimentalComposeUiApi::class)
-    override val modifier: Modifier = modifierElementOf(
-        create = { rootFocusNode },
-        definitions = { name = "RootFocusTarget" }
-    )
+    override val modifier: Modifier = object : ModifierNodeElement<FocusTargetModifierNode>() {
+        override fun create() = rootFocusNode
+
+        override fun update(node: FocusTargetModifierNode) = node
+
+        override fun InspectorInfo.inspectableProperties() {
+            name = "RootFocusTarget"
+        }
+
+        override fun hashCode(): Int = rootFocusNode.hashCode()
+
+        override fun equals(other: Any?) = other === this
+    }
 
     override lateinit var layoutDirection: LayoutDirection
 
@@ -149,7 +158,7 @@
                 // If we didn't find a potential next item, try to wrap around.
                 return foundNextItem || wrapAroundFocus(focusDirection)
             }
-            else -> return next.findFocusTarget { it.requestFocus() } ?: false
+            else -> return next.findFocusTarget { it.requestFocus() }
         }
     }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
index 446f85c..8404c04 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusProperties.kt
@@ -18,7 +18,8 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * Properties that are applied to [focusTarget] that is the first child of the
@@ -176,19 +177,25 @@
  *
  * @sample androidx.compose.ui.samples.FocusPropertiesSample
  */
-@Suppress("ModifierInspectorInfo") // b/251831790.
-fun Modifier.focusProperties(scope: FocusProperties.() -> Unit): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    (modifierElementOf(
-        key = scope,
-        create = { FocusPropertiesModifierNodeImpl(scope) },
-        update = { it.focusPropertiesScope = scope },
-        definitions = {
-            name = "focusProperties"
-            properties["scope"] = scope
-        }
-    ))
-)
+fun Modifier.focusProperties(
+    scope: FocusProperties.() -> Unit
+): Modifier = this then FocusPropertiesElement(scope)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class FocusPropertiesElement(
+    val scope: FocusProperties.() -> Unit
+) : ModifierNodeElement<FocusPropertiesModifierNodeImpl>() {
+    override fun create() = FocusPropertiesModifierNodeImpl(scope)
+
+    override fun update(node: FocusPropertiesModifierNodeImpl) = node.apply {
+        focusPropertiesScope = scope
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "focusProperties"
+        properties["scope"] = scope
+    }
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class FocusPropertiesModifierNodeImpl(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
index d5bbb48..32f3a39 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequester.kt
@@ -23,7 +23,7 @@
 import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.node.visitChildren
 
-private const val focusRequesterNotInitialized = """
+private const val FocusRequesterNotInitialized = """
    FocusRequester is not initialized. Here are some possible fixes:
 
    1. Remember the FocusRequester: val focusRequester = remember { FocusRequester() }
@@ -32,6 +32,11 @@
    response to some event. Eg Modifier.clickable { focusRequester.requestFocus() }
 """
 
+private const val InvalidFocusRequesterInvocation = """
+    Please check whether the focusRequester is FocusRequester.Cancel or FocusRequester.Default
+    before invoking any functions on the focusRequester.
+"""
+
 /**
  * The [FocusRequester] is used in conjunction with
  * [Modifier.focusRequester][androidx.compose.ui.focus.focusRequester] to send requests to
@@ -55,8 +60,6 @@
      * @sample androidx.compose.ui.samples.RequestFocusSample
      */
     fun requestFocus() {
-        @OptIn(ExperimentalComposeUiApi::class)
-        check(focusRequesterNodes.isNotEmpty()) { focusRequesterNotInitialized }
         // TODO(b/245755256): Add another API that returns a Boolean indicating
         //  whether requestFocus succeeded or not.
         @OptIn(ExperimentalComposeUiApi::class)
@@ -73,23 +76,20 @@
      * associated with this [FocusRequester].
      */
     @OptIn(ExperimentalComposeUiApi::class)
-    internal fun findFocusTarget(onFound: (FocusTargetModifierNode) -> Boolean): Boolean? {
-        return when (this) {
-            Cancel -> false
-            Default -> null
-            else -> {
-                var success: Boolean? = null
-                focusRequesterNodes.forEach { node ->
-                    node.visitChildren(Nodes.FocusTarget) {
-                        if (onFound(it)) {
-                            success = true
-                            return@forEach
-                        }
-                    }
+    internal fun findFocusTarget(onFound: (FocusTargetModifierNode) -> Boolean): Boolean {
+        check(this != Default) { InvalidFocusRequesterInvocation }
+        check(this != Cancel) { InvalidFocusRequesterInvocation }
+        check(focusRequesterNodes.isNotEmpty()) { FocusRequesterNotInitialized }
+        var success = false
+        focusRequesterNodes.forEach { node ->
+            node.visitChildren(Nodes.FocusTarget) {
+                if (onFound(it)) {
+                    success = true
+                    return@forEach
                 }
-                success
             }
         }
+        return success
     }
 
     /**
@@ -109,7 +109,7 @@
      */
     @OptIn(ExperimentalComposeUiApi::class)
     fun captureFocus(): Boolean {
-        check(focusRequesterNodes.isNotEmpty()) { focusRequesterNotInitialized }
+        check(focusRequesterNodes.isNotEmpty()) { FocusRequesterNotInitialized }
         focusRequesterNodes.forEach {
             if (it.captureFocus()) {
                 return true
@@ -134,7 +134,7 @@
      */
     @OptIn(ExperimentalComposeUiApi::class)
     fun freeFocus(): Boolean {
-        check(focusRequesterNodes.isNotEmpty()) { focusRequesterNotInitialized }
+        check(focusRequesterNodes.isNotEmpty()) { FocusRequesterNotInitialized }
         focusRequesterNodes.forEach {
             if (it.freeFocus()) {
                 return true
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
index 4af7a97..dd6fd9f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusRequesterModifier.kt
@@ -18,7 +18,8 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * A [modifier][Modifier.Element] that is used to pass in a [FocusRequester] that can be used to
@@ -45,23 +46,26 @@
  *
  * @sample androidx.compose.ui.samples.RequestFocusSample
  */
-@Suppress("ModifierInspectorInfo") // b/251831790.
-fun Modifier.focusRequester(focusRequester: FocusRequester): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    (modifierElementOf(
-        key = focusRequester,
-        create = { FocusRequesterModifierNodeImpl(focusRequester) },
-        update = {
-            it.focusRequester.focusRequesterNodes -= it
-            it.focusRequester = focusRequester
-            it.focusRequester.focusRequesterNodes += it
-        },
-        definitions = {
-            name = "focusRequester"
-            properties["focusRequester"] = focusRequester
-        }
-    ))
-)
+fun Modifier.focusRequester(focusRequester: FocusRequester): Modifier =
+    this then FocusRequesterElement(focusRequester)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class FocusRequesterElement(
+    val focusRequester: FocusRequester
+) : ModifierNodeElement<FocusRequesterModifierNodeImpl>() {
+    override fun create() = FocusRequesterModifierNodeImpl(focusRequester)
+
+    override fun update(node: FocusRequesterModifierNodeImpl) = node.apply {
+        focusRequester.focusRequesterNodes -= this
+        focusRequester = this@FocusRequesterElement.focusRequester
+        focusRequester.focusRequesterNodes += this
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "focusRequester"
+        properties["focusRequester"] = focusRequester
+    }
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class FocusRequesterModifierNodeImpl(
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 b73a8cb..57ec4b0 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
@@ -25,12 +25,13 @@
 import androidx.compose.ui.layout.BeyondBoundsLayout
 import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout
 import androidx.compose.ui.modifier.ModifierLocalNode
+import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.node.Nodes
 import androidx.compose.ui.node.ObserverNode
-import androidx.compose.ui.node.modifierElementOf
 import androidx.compose.ui.node.observeReads
 import androidx.compose.ui.node.requireOwner
 import androidx.compose.ui.node.visitAncestors
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * This modifier node can be used to create a modifier that makes a component focusable.
@@ -120,10 +121,16 @@
         }
     }
 
-    internal companion object {
-        internal val FocusTargetModifierElement = modifierElementOf(
-            create = { FocusTargetModifierNode() },
-            definitions = { name = "focusTarget" }
-        )
+    internal object FocusTargetModifierElement : ModifierNodeElement<FocusTargetModifierNode>() {
+        override fun create() = FocusTargetModifierNode()
+
+        override fun update(node: FocusTargetModifierNode) = node
+
+        override fun InspectorInfo.inspectableProperties() {
+            name = "focusTarget"
+        }
+
+        override fun hashCode() = "focusTarget".hashCode()
+        override fun equals(other: Any?) = other === this
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
index 68a42ed..0420c19 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
@@ -102,7 +102,7 @@
 ): Boolean {
     return when (focusDirection) {
         Next, Previous -> oneDimensionalFocusSearch(focusDirection, onFound)
-        Left, Right, Up, Down -> twoDimensionalFocusSearch(focusDirection, onFound)
+        Left, Right, Up, Down -> twoDimensionalFocusSearch(focusDirection, onFound) ?: false
         @OptIn(ExperimentalComposeUiApi::class)
         Enter -> {
             // we search among the children of the active item.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
index 2007a4c..ad9109f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
@@ -23,6 +23,8 @@
 import androidx.compose.ui.focus.FocusDirection.Companion.Left
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
 import androidx.compose.ui.focus.FocusDirection.Companion.Up
+import androidx.compose.ui.focus.FocusRequester.Companion.Cancel
+import androidx.compose.ui.focus.FocusRequester.Companion.Default
 import androidx.compose.ui.focus.FocusStateImpl.Active
 import androidx.compose.ui.focus.FocusStateImpl.ActiveParent
 import androidx.compose.ui.focus.FocusStateImpl.Captured
@@ -44,12 +46,16 @@
  *  of the children is currently focused, we start from that point and search in the specified
  *  [direction][FocusDirection]. If none of the children are currently focused, we pick the
  *  top-left or bottom right based on the specified [direction][FocusDirection].
+ *
+ *  @return The value of [onFound] if a [focusTarget] was found, false if no [focusTarget] was
+ *  found, and null if focus search was cancelled using [FocusRequester.Cancel] or if a custom
+ *  focus search destination didn't point to any [focusTarget].
  */
 @ExperimentalComposeUiApi
 internal fun FocusTargetModifierNode.twoDimensionalFocusSearch(
     direction: FocusDirection,
     onFound: (FocusTargetModifierNode) -> Boolean
-): Boolean {
+): Boolean? {
     when (focusStateImpl) {
         Inactive -> return if (fetchFocusProperties().canFocus) onFound.invoke(this) else false
         ActiveParent -> {
@@ -62,15 +68,16 @@
             when (focusedChild.focusStateImpl) {
 
                 ActiveParent -> {
-                    // If the focusedChild is an intermediate parent,
-                    // we continue searching among its children.
-                    if (focusedChild.twoDimensionalFocusSearch(direction, onFound)) return true
+                    // If the focusedChild is an intermediate parent, we search among its children.
+                    val found = focusedChild.twoDimensionalFocusSearch(direction, onFound)
+                    if (found != false) return found
 
                     // If we don't find a match, we exit this Parent.
                     // First check if this node has a custom focus exit.
                     focusedChild
-                        .fetchFocusProperties().exit(direction)
-                        .findFocusTarget(onFound)?.let { return it }
+                        .fetchFocusProperties().exit(direction).takeUnless { it == Default }?.let {
+                            return if (it == Cancel) null else it.findFocusTarget(onFound)
+                        }
 
                     // If we don't have a custom exit property,
                     // we search among the siblings of the parent.
@@ -106,7 +113,9 @@
 ): Boolean {
 
     // Check if a custom FocusEnter is specified.
-    fetchFocusProperties().enter(direction).findFocusTarget(onFound)?.let { return it }
+    fetchFocusProperties().enter(direction).takeUnless { it == Default }?.let {
+        return if (it == Cancel) false else it.findFocusTarget(onFound)
+    }
 
     val focusableChildren = MutableVector<FocusTargetModifierNode>()
     collectAccessibleChildren(focusableChildren)
@@ -179,7 +188,9 @@
         if (nextItem.fetchFocusProperties().canFocus) return onFound.invoke(nextItem)
 
         // If the result is deactivated, and the deactivated node has a custom Enter, we use it.
-        nextItem.fetchFocusProperties().enter(direction).findFocusTarget(onFound)?.let { return it }
+        nextItem.fetchFocusProperties().enter(direction).takeUnless { it == Default }?.let {
+            return if (it == Cancel) false else it.findFocusTarget(onFound)
+        }
 
         // If the result is deactivated, and there is no custom enter, we search among its children.
         if (nextItem.generateAndSearchChildren(focusedItem, direction, onFound)) return true
@@ -208,18 +219,18 @@
         }
 
         // If we encounter a deactivated child, we mimic a moveFocus(Enter).
-        when (val customEnter = it.fetchFocusProperties().enter(Enter)) {
+        it.fetchFocusProperties().enter(Enter).takeUnless { it == Default }?.let {
             // If the user declined a custom enter, omit this part of the tree.
-            FocusRequester.Cancel -> return@visitSubtreeIf false
-
-            // If there is no custom enter, we consider all the children.
-            FocusRequester.Default -> return@visitSubtreeIf true
-
-            else -> customEnter.focusRequesterNodes.forEach { node ->
-                node.collectAccessibleChildren(accessibleChildren)
+            if (it != Cancel) {
+                it.focusRequesterNodes.forEach { node ->
+                    node.collectAccessibleChildren(accessibleChildren)
+                }
             }
+            return@visitSubtreeIf false
         }
-        false
+
+        // If there is no custom enter, we consider all the children.
+        return@visitSubtreeIf true
     }
 }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
index 5fa5bdc..6117373 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/GraphicsLayerModifier.kt
@@ -26,9 +26,8 @@
 import androidx.compose.ui.node.LayoutModifierNode
 import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.node.Nodes
-import androidx.compose.ui.node.modifierElementOf
 import androidx.compose.ui.node.requireCoordinator
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.unit.Constraints
 
@@ -385,7 +384,7 @@
 )
 
 @ExperimentalComposeUiApi
-private class GraphicsLayerModifierNodeElement(
+private data class GraphicsLayerModifierNodeElement(
     val scaleX: Float,
     val scaleY: Float,
     val alpha: Float,
@@ -403,28 +402,7 @@
     val ambientShadowColor: Color,
     val spotShadowColor: Color,
     val compositingStrategy: CompositingStrategy
-) : ModifierNodeElement<SimpleGraphicsLayerModifier>(
-    inspectorInfo = debugInspectorInfo {
-        name = "graphicsLayer"
-        properties["scaleX"] = scaleX
-        properties["scaleY"] = scaleY
-        properties["alpha"] = alpha
-        properties["translationX"] = translationX
-        properties["translationY"] = translationY
-        properties["shadowElevation"] = shadowElevation
-        properties["rotationX"] = rotationX
-        properties["rotationY"] = rotationY
-        properties["rotationZ"] = rotationZ
-        properties["cameraDistance"] = cameraDistance
-        properties["transformOrigin"] = transformOrigin
-        properties["shape"] = shape
-        properties["clip"] = clip
-        properties["renderEffect"] = renderEffect
-        properties["ambientShadowColor"] = ambientShadowColor
-        properties["spotShadowColor"] = spotShadowColor
-        properties["compositingStrategy"] = compositingStrategy
-    }
-) {
+) : ModifierNodeElement<SimpleGraphicsLayerModifier>() {
     override fun create(): SimpleGraphicsLayerModifier {
         return SimpleGraphicsLayerModifier(
             scaleX = scaleX,
@@ -469,49 +447,26 @@
 
         return node
     }
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ModifierNodeElement<*>) return false
-        if (other !is GraphicsLayerModifierNodeElement) return false
 
-        return this.scaleX == other.scaleX &&
-            this.scaleY == other.scaleY &&
-            this.alpha == other.alpha &&
-            this.translationX == other.translationX &&
-            this.translationY == other.translationY &&
-            this.shadowElevation == other.shadowElevation &&
-            this.rotationX == other.rotationX &&
-            this.rotationY == other.rotationY &&
-            this.rotationZ == other.rotationZ &&
-            this.cameraDistance == other.cameraDistance &&
-            this.transformOrigin == other.transformOrigin &&
-            this.shape == other.shape &&
-            this.clip == other.clip &&
-            this.renderEffect == other.renderEffect &&
-            this.ambientShadowColor == other.ambientShadowColor &&
-            this.spotShadowColor == other.spotShadowColor &&
-            this.compositingStrategy == other.compositingStrategy
-    }
-
-    override fun hashCode(): Int {
-        var result = scaleX.hashCode()
-        result = 31 * result + scaleY.hashCode()
-        result = 31 * result + alpha.hashCode()
-        result = 31 * result + translationX.hashCode()
-        result = 31 * result + translationY.hashCode()
-        result = 31 * result + shadowElevation.hashCode()
-        result = 31 * result + rotationX.hashCode()
-        result = 31 * result + rotationY.hashCode()
-        result = 31 * result + rotationZ.hashCode()
-        result = 31 * result + cameraDistance.hashCode()
-        result = 31 * result + transformOrigin.hashCode()
-        result = 31 * result + shape.hashCode()
-        result = 31 * result + clip.hashCode()
-        result = 31 * result + renderEffect.hashCode()
-        result = 31 * result + ambientShadowColor.hashCode()
-        result = 31 * result + spotShadowColor.hashCode()
-        result = 31 * result + compositingStrategy.hashCode()
-        return result
+    override fun InspectorInfo.inspectableProperties() {
+        name = "graphicsLayer"
+        properties["scaleX"] = scaleX
+        properties["scaleY"] = scaleY
+        properties["alpha"] = alpha
+        properties["translationX"] = translationX
+        properties["translationY"] = translationY
+        properties["shadowElevation"] = shadowElevation
+        properties["rotationX"] = rotationX
+        properties["rotationY"] = rotationY
+        properties["rotationZ"] = rotationZ
+        properties["cameraDistance"] = cameraDistance
+        properties["transformOrigin"] = transformOrigin
+        properties["shape"] = shape
+        properties["clip"] = clip
+        properties["renderEffect"] = renderEffect
+        properties["ambientShadowColor"] = ambientShadowColor
+        properties["spotShadowColor"] = spotShadowColor
+        properties["compositingStrategy"] = compositingStrategy
     }
 }
 
@@ -530,18 +485,9 @@
  *
  * @param block block on [GraphicsLayerScope] where you define the layer properties.
  */
-@OptIn(ExperimentalComposeUiApi::class)
 @Stable
 fun Modifier.graphicsLayer(block: GraphicsLayerScope.() -> Unit): Modifier =
-    this then modifierElementOf(
-        key = block,
-        create = { BlockGraphicsLayerModifier(block) },
-        definitions = debugInspectorInfo {
-            name = "graphicsLayer"
-            properties["block"] = block
-        },
-        update = { it.layerBlock = block }
-    )
+    this then BlockGraphicsLayerElement(block)
 
 /**
  * Determines when to render the contents of a layer into an offscreen buffer before
@@ -599,6 +545,22 @@
     if (isDebugInspectorInfoEnabled) this.then(Modifier.graphicsLayer()) else this
 
 @OptIn(ExperimentalComposeUiApi::class)
+private data class BlockGraphicsLayerElement(
+    val block: GraphicsLayerScope.() -> Unit
+) : ModifierNodeElement<BlockGraphicsLayerModifier>() {
+    override fun create() = BlockGraphicsLayerModifier(block)
+
+    override fun update(node: BlockGraphicsLayerModifier) = node.apply {
+        layerBlock = block
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "graphicsLayer"
+        properties["block"] = block
+    }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
 private class BlockGraphicsLayerModifier(
     var layerBlock: GraphicsLayerScope.() -> Unit,
 ) : LayoutModifierNode, Modifier.Node() {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
index 4fa07ad..4d620d4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifier.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.input.key
 
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
 
 /**
  * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
@@ -30,19 +28,9 @@
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
-@OptIn(ExperimentalComposeUiApi::class)
-@Suppress("ModifierInspectorInfo") // b/251831790.
-fun Modifier.onKeyEvent(onKeyEvent: (KeyEvent) -> Boolean): Modifier = this.then(
-    modifierElementOf(
-        key = onKeyEvent,
-        create = { KeyInputInputModifierNodeImpl(onEvent = onKeyEvent, onPreEvent = null) },
-        update = { it.onEvent = onKeyEvent },
-        definitions = {
-            name = "onKeyEvent"
-            properties["onKeyEvent"] = onKeyEvent
-        }
-    )
-)
+fun Modifier.onKeyEvent(
+    onKeyEvent: (KeyEvent) -> Boolean
+): Modifier = this then OnKeyEventElement(onKeyEvent)
 
 /**
  * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
@@ -56,16 +44,6 @@
  *
  * @sample androidx.compose.ui.samples.KeyEventSample
  */
-@OptIn(ExperimentalComposeUiApi::class)
-@Suppress("ModifierInspectorInfo") // b/251831790.
-fun Modifier.onPreviewKeyEvent(onPreviewKeyEvent: (KeyEvent) -> Boolean): Modifier = this.then(
-    modifierElementOf(
-        key = onPreviewKeyEvent,
-        create = { KeyInputInputModifierNodeImpl(onEvent = null, onPreEvent = onPreviewKeyEvent) },
-        update = { it.onPreEvent = onPreviewKeyEvent },
-        definitions = {
-            name = "onPreviewKeyEvent"
-            properties["onPreviewKeyEvent"] = onPreviewKeyEvent
-        }
-    )
-)
+fun Modifier.onPreviewKeyEvent(
+    onPreviewKeyEvent: (KeyEvent) -> Boolean
+): Modifier = this then OnPreviewKeyEvent(onPreviewKeyEvent)
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
index 47ad734..8aeb4b9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyInputModifierNode.kt
@@ -19,6 +19,8 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.node.DelegatableNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * Implement this interface to create a [Modifier.Node] that can intercept hardware Key events.
@@ -48,6 +50,45 @@
     fun onPreKeyEvent(event: KeyEvent): Boolean
 }
 
+@OptIn(ExperimentalComposeUiApi::class)
+internal data class OnKeyEventElement(
+    val onKeyEvent: (KeyEvent) -> Boolean
+) : ModifierNodeElement<KeyInputInputModifierNodeImpl>() {
+    override fun create() = KeyInputInputModifierNodeImpl(
+        onEvent = onKeyEvent,
+        onPreEvent = null
+    )
+
+    override fun update(node: KeyInputInputModifierNodeImpl) = node.apply {
+        onEvent = onKeyEvent
+        onPreEvent = null
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onKeyEvent"
+        properties["onKeyEvent"] = onKeyEvent
+    }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal data class OnPreviewKeyEvent(
+    val onPreviewKeyEvent: (KeyEvent) -> Boolean
+) : ModifierNodeElement<KeyInputInputModifierNodeImpl>() {
+    override fun create(): KeyInputInputModifierNodeImpl {
+        return KeyInputInputModifierNodeImpl(onEvent = null, onPreEvent = onPreviewKeyEvent)
+    }
+
+    override fun update(node: KeyInputInputModifierNodeImpl) = node.apply {
+        onPreEvent = onPreviewKeyEvent
+        onEvent = null
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onPreviewKeyEvent"
+        properties["onPreviewKeyEvent"] = onPreviewKeyEvent
+    }
+}
+
 @ExperimentalComposeUiApi
 internal class KeyInputInputModifierNodeImpl(
     var onEvent: ((KeyEvent) -> Boolean)?,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
index 30002e0..076a965 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifier.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.input.rotary
 
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.modifierElementOf
 
 /**
  * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
@@ -39,21 +37,9 @@
  * access to a [RotaryScrollEvent] when a child does not consume it:
  * @sample androidx.compose.ui.samples.PreRotaryEventSample
  */
-@Suppress("ModifierInspectorInfo") // b/251831790.
 fun Modifier.onRotaryScrollEvent(
     onRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
-): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    modifierElementOf(
-        key = onRotaryScrollEvent,
-        create = { RotaryInputModifierNodeImpl(onEvent = onRotaryScrollEvent, onPreEvent = null) },
-        update = { it.onEvent = onRotaryScrollEvent },
-        definitions = {
-            name = "onRotaryScrollEvent"
-            properties["onRotaryScrollEvent"] = onRotaryScrollEvent
-        }
-    )
-)
+): Modifier = this then OnRotaryScrollEventElement(onRotaryScrollEvent)
 
 /**
  * Adding this [modifier][Modifier] to the [modifier][Modifier] parameter of a component will
@@ -76,20 +62,6 @@
  *
  * @sample androidx.compose.ui.samples.PreRotaryEventSample
  */
-@Suppress("ModifierInspectorInfo") // b/251831790.
 fun Modifier.onPreRotaryScrollEvent(
     onPreRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
-): Modifier = this.then(
-    @OptIn(ExperimentalComposeUiApi::class)
-    modifierElementOf(
-        key = onPreRotaryScrollEvent,
-        create = {
-            RotaryInputModifierNodeImpl(onEvent = null, onPreEvent = onPreRotaryScrollEvent)
-        },
-        update = { it.onPreEvent = onPreRotaryScrollEvent },
-        definitions = {
-            name = "onPreRotaryScrollEvent"
-            properties["onPreRotaryScrollEvent"] = onPreRotaryScrollEvent
-        }
-    )
-)
+): Modifier = this then OnPreRotaryScrollEventElement(onPreRotaryScrollEvent)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
index c1be0a7..05f8d64 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/rotary/RotaryInputModifierNode.kt
@@ -19,6 +19,8 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.node.DelegatableNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * Implement this interface to create a [Modifier.Node] that can intercept rotary scroll events.
@@ -48,6 +50,46 @@
 }
 
 @OptIn(ExperimentalComposeUiApi::class)
+internal data class OnRotaryScrollEventElement(
+    val onRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
+) : ModifierNodeElement<RotaryInputModifierNodeImpl>() {
+    override fun create() = RotaryInputModifierNodeImpl(
+        onEvent = onRotaryScrollEvent,
+        onPreEvent = null
+    )
+
+    override fun update(node: RotaryInputModifierNodeImpl) = node.apply {
+        onEvent = onRotaryScrollEvent
+        onPreEvent = null
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onRotaryScrollEvent"
+        properties["onRotaryScrollEvent"] = onRotaryScrollEvent
+    }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+internal data class OnPreRotaryScrollEventElement(
+    val onPreRotaryScrollEvent: (RotaryScrollEvent) -> Boolean
+) : ModifierNodeElement<RotaryInputModifierNodeImpl>() {
+    override fun create() = RotaryInputModifierNodeImpl(
+        onEvent = null,
+        onPreEvent = onPreRotaryScrollEvent
+    )
+
+    override fun update(node: RotaryInputModifierNodeImpl) = node.apply {
+        onPreEvent = onPreRotaryScrollEvent
+        onEvent = null
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
+        name = "onPreRotaryScrollEvent"
+        properties["onPreRotaryScrollEvent"] = onPreRotaryScrollEvent
+    }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
 internal class RotaryInputModifierNodeImpl(
     var onEvent: ((RotaryScrollEvent) -> Boolean)?,
     var onPreEvent: ((RotaryScrollEvent) -> Boolean)?
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
index abb028f..e9f36f0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutModifier.kt
@@ -21,7 +21,8 @@
 import androidx.compose.ui.graphics.GraphicsLayerScope
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 import androidx.compose.ui.node.LayoutModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
@@ -263,18 +264,25 @@
  *
  * @see androidx.compose.ui.layout.LayoutModifier
  */
-@OptIn(ExperimentalComposeUiApi::class)
 fun Modifier.layout(
     measure: MeasureScope.(Measurable, Constraints) -> MeasureResult
-) = this then modifierElementOf(
-    key = measure,
-    create = { LayoutModifierImpl(measure) },
-    update = { layoutModifier -> layoutModifier.measureBlock = measure },
-    definitions = {
+) = this then LayoutModifierElement(measure)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class LayoutModifierElement(
+    val measure: MeasureScope.(Measurable, Constraints) -> MeasureResult
+) : ModifierNodeElement<LayoutModifierImpl>() {
+    override fun create() = LayoutModifierImpl(measure)
+
+    override fun update(node: LayoutModifierImpl) = node.apply {
+        measureBlock = measure
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
         name = "layout"
         properties["measure"] = measure
     }
-)
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 internal class LayoutModifierImpl(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
index 860638c..be3df73 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnPlacedModifier.kt
@@ -21,7 +21,8 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 import androidx.compose.ui.node.LayoutAwareModifierNode
-import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.platform.InspectorInfo
 
 /**
  * Invoke [onPlaced] after the parent [LayoutModifier] and parent layout has been placed and before
@@ -30,23 +31,26 @@
  *
  * @sample androidx.compose.ui.samples.OnPlaced
  */
-@OptIn(ExperimentalComposeUiApi::class)
 @Stable
 fun Modifier.onPlaced(
     onPlaced: (LayoutCoordinates) -> Unit
-) = this then modifierElementOf(
-    key = onPlaced,
-    create = {
-        OnPlacedModifierImpl(callback = onPlaced)
-    },
-    update = {
-        it.callback = onPlaced
-    },
-    definitions = {
+) = this then OnPlacedElement(onPlaced)
+
+@OptIn(ExperimentalComposeUiApi::class)
+private data class OnPlacedElement(
+    val onPlaced: (LayoutCoordinates) -> Unit
+) : ModifierNodeElement<OnPlacedModifierImpl>() {
+    override fun create() = OnPlacedModifierImpl(callback = onPlaced)
+
+    override fun update(node: OnPlacedModifierImpl) = node.apply {
+        callback = onPlaced
+    }
+
+    override fun InspectorInfo.inspectableProperties() {
         name = "onPlaced"
         properties["onPlaced"] = onPlaced
     }
-)
+}
 
 @OptIn(ExperimentalComposeUiApi::class)
 private class OnPlacedModifierImpl(
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 a936861..64eb264 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
@@ -18,10 +18,12 @@
 
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.areObjectsOfSameType
+import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.InspectorInfo
-import androidx.compose.ui.platform.InspectorValueInfo
-import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.platform.ValueElement
+import androidx.compose.ui.util.fastForEach
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.isAccessible
 
 /**
  * A [Modifier.Element] which manages an instance of a particular [Modifier.Node] implementation. A
@@ -29,31 +31,51 @@
  * and updates that implementation is applied to a Layout.
  *
  * A [ModifierNodeElement] should be very lightweight, and do little more than hold the information
- * necessary to
+ * necessary to create and maintain an instance of the associated [Modifier.Node] type.
+ *
+ * @sample androidx.compose.ui.samples.ModifierNodeElementSample
+ * @sample androidx.compose.ui.samples.SemanticsModifierNodeSample
  *
  * @see Modifier.Node
  * @see Modifier.Element
- * @see modifierElementOf
  */
 @ExperimentalComposeUiApi
-abstract class ModifierNodeElement<N : Modifier.Node>(
+abstract class ModifierNodeElement<N : Modifier.Node> : Modifier.Element, InspectableValue {
+
     /**
-     * An object which holds all of the "inputs" or "parameters" that will be passed into the
-     * [Modifier.Node]. Even though most inputs to the create/update of a [Modifier.Node] may
-     * come from a captured reference, it is important to pass them into here explicitly as well so
-     * that they will get included in equals() and hashCode() calculations. Having it as a single
-     * object on the abstract class allows us to have anonymous objects implement
-     * [ModifierNodeElement] while still having a reasonable equals implementation.
-     */
-    internal val params: Any? = null,
-    internal val autoInvalidate: Boolean = true,
-    /**
-     * This lambda will construct a debug-only set of information for use with tooling.
+     * If this property returns `true`, then nodes will be automatically invalidated after the
+     * [update] callback completes (For example, if the returned Node is a [DrawModifierNode], its
+     * [DrawModifierNode.invalidateDraw] function will be invoked automatically as part of
+     * auto invalidation).
      *
-     * @see InspectorValueInfo
+     * This is enabled by default, and provides a convenient mechanism to schedule invalidation
+     * and apply changes made to the modifier. You may choose to set this to `false` if your
+     * modifier has auto-invalidatable properties that do not frequently require invalidation to
+     * improve performance by skipping unnecessary invalidation. If `autoInvalidate` is set to
+     * `false`, you must call the appropriate invalidate functions manually in [update] for the
+     * new attributes to become visible.
      */
-    inspectorInfo: InspectorInfo.() -> Unit
-) : Modifier.Element, InspectorValueInfo(inspectorInfo) {
+    open val autoInvalidate: Boolean
+        get() = true
+
+    private var _inspectorValues: InspectorInfo? = null
+    private val inspectorValues: InspectorInfo
+        get() = _inspectorValues ?: InspectorInfo()
+            .apply {
+                name = this@ModifierNodeElement::class.simpleName
+                inspectableProperties()
+            }
+            .also { _inspectorValues = it }
+
+    final override val nameFallback: String?
+        get() = inspectorValues.name
+
+    final override val valueOverride: Any?
+        get() = inspectorValues.value
+
+    final override val inspectableElements: Sequence<ValueElement>
+        get() = inspectorValues.properties
+
     /**
      * This will be called the first time the modifier is applied to the Layout and it should
      * construct and return the corresponding [Modifier.Node] instance.
@@ -61,84 +83,89 @@
     abstract fun create(): N
 
     /**
-     * Called when a modifier is applied to a Layout whose [params] have changed from the previous
-     * application. This lambda will have the current node instance passed in as a parameter, and
+     * Called when a modifier is applied to a Layout whose inputs have changed from the previous
+     * application. This function will have the current node instance passed in as a parameter, and
      * it is expected that the node will be brought up to date.
      */
     abstract fun update(node: N): N
 
-    override fun hashCode(): Int {
-        return params.hashCode()
+    /**
+     * Populates an [InspectorInfo] object with attributes to display in the layout inspector. This
+     * is called by tooling to resolve the properties of this modifier. By convention, implementors
+     * should set the [name][InspectorInfo.name] to the function name of the modifier.
+     *
+     * The default implementation will attempt to reflectively populate the inspector info with the
+     * properties declared on the subclass. It will also set the [name][InspectorInfo.name] property
+     * to the name of this instance's class by default (not the name of the modifier function).
+     * Modifier property population depends on the kotlin-reflect library. If it is not in the
+     * classpath at runtime, the default implementation of this function will populate the
+     * properties with an error message.
+     *
+     * If you override this function and provide the properties you wish to display, you do not need
+     * to call `super`. Doing so may result in duplicate properties appearing in the layout
+     * inspector.
+     */
+    open fun InspectorInfo.inspectableProperties() {
+        val element = this@ModifierNodeElement
+        val elementClass = element::class
+        try {
+            elementClass.members
+                // Properties declared in the constructor will appear after ones defined in the
+                // class, so sort by the property name to make the result more well-defined.
+                .sortedBy { it.name }
+                .fastForEach { member ->
+                    if (member is KProperty1<*, *> && member.name !in builtInProperties) {
+                        try {
+                            @Suppress("UNCHECKED_CAST")
+                            val property = (member as KProperty1<ModifierNodeElement<N>, Any?>)
+                            property.isAccessible = true
+                            properties[property.name] = property.get(element)
+                        } catch (e: Exception) {
+                            // Do nothing. Just ignore the field and prevent the error from crashing
+                            // the application and ending the debugging session.
+                        }
+                    }
+                }
+        } catch (e: KotlinReflectionNotSupportedError) {
+            properties["inspector error"] = "Can't automatically resolve properties of $element " +
+                "because Kotlin reflection is unavailable. Consider adding" +
+                "'debugImplementation \"org.jetbrains.kotlin:kotlin-reflect:\$kotlin_version\"' " +
+                "to your module's gradle dependencies block."
+        }
     }
 
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (other !is ModifierNodeElement<*>) return false
-        if (!areObjectsOfSameType(this, other)) return false
-        return params == other.params
+    // Require hashCode() to be implemented. Using a data class is sufficient. Singletons and
+    // modifiers with no parameters may implement this function by returning an arbitrary constant.
+    abstract override fun hashCode(): Int
+
+    // Require equals() to be implemented. Using a data class is sufficient. Singletons may
+    // implement this function with referential equality (`this === other`). Modifiers with no
+    // inputs may implement this function by checking the type of the other object.
+    abstract override fun equals(other: Any?): Boolean
+
+    private companion object {
+        /**
+         * A list of properties defined by [ModifierNodeElement], computed with reflection at
+         * runtime. We use this list in the default implementation of [inspectableElements] as a
+         * way to hide properties defined by `ModifierNodeElement` from the layout inspector. Just
+         * looking at the name is acceptable because you can't have multiple properties with the
+         * same name and can't create a property that's been defined in `ModifierNodeElement`
+         * without overriding it.
+         */
+        private val builtInProperties: Set<String> by lazy(LazyThreadSafetyMode.NONE) {
+            try {
+                buildSet {
+                    ModifierNodeElement::class.members.forEach { member ->
+                        if (member is KProperty1<*, *>) {
+                            add(member.name)
+                        }
+                    }
+                }
+            } catch (e: Exception) {
+                emptySet()
+            } catch (e: KotlinReflectionNotSupportedError) {
+                emptySet()
+            }
+        }
     }
-}
-
-/**
- * A helpful API for constructing a [ModifierNodeElement] corresponding to a particular
- * [Modifier.Node] implementation.
- *
- * @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 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,
- *  and it is expected that the node will be brought up to date.
- * @param definitions This lambda will construct a debug-only set of information for use with
- *  tooling.
- *
- * @sample androidx.compose.ui.samples.ModifierElementOfSample
- * @sample androidx.compose.ui.samples.LayoutModifierNodeSample
- * @sample androidx.compose.ui.samples.DrawModifierNodeSample
- * @sample androidx.compose.ui.samples.GlobalPositionAwareModifierNodeSample
- * @sample androidx.compose.ui.samples.LayoutAwareModifierNodeSample
- * @sample androidx.compose.ui.samples.PointerInputModifierNodeSample
- *
- * @see ModifierNodeElement
- * @see Modifier.Element
- */
-// TODO(lmr): make sure this produces reasonable bytecode.
-@Suppress("MissingNullability", "ModifierFactoryExtensionFunction")
-@ExperimentalComposeUiApi
-inline fun <reified T : Modifier.Node> modifierElementOf(
-    key: Any?,
-    crossinline create: () -> T,
-    crossinline update: (T) -> Unit,
-    crossinline definitions: InspectorInfo.() -> Unit
-): Modifier = object : ModifierNodeElement<T>(key, true, debugInspectorInfo(definitions)) {
-    override fun create(): T = create()
-    override fun update(node: T): T = node.also(update)
-}
-
-/**
- * A helpful API for constructing a [ModifierNodeElement] corresponding to a particular
- * [Modifier.Node] implementation. This overload is expected to be used for parameter-less Modifier
- * factories. For Modifier factories with parameters, consider using the overload of this method
- * 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 corresponding [Modifier.Node] instance
- * @param definitions This lambda will construct a debug-only set of information for use with
- *  tooling.
- *
- * @sample androidx.compose.ui.samples.ModifierElementOfSample
- * @sample androidx.compose.ui.samples.SemanticsModifierNodeSample
- *
- * @see ModifierNodeElement
- * @see Modifier.Element
- */
-@Suppress("MissingNullability", "ModifierFactoryExtensionFunction")
-@ExperimentalComposeUiApi
-inline fun <reified T : Modifier.Node> modifierElementOf(
-    crossinline create: () -> T,
-    crossinline definitions: InspectorInfo.() -> Unit
-): Modifier = object : ModifierNodeElement<T>(null, true, debugInspectorInfo(definitions)) {
-    override fun create(): T = create()
-    override fun update(node: T): T = node
 }
\ No newline at end of file
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/LayoutNodeTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
index 1e0d0a9..1f258e8 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
@@ -1385,8 +1385,14 @@
         val semanticsModifier2 = object : SemanticsModifierNode, Modifier.Node() {
             override val semanticsConfiguration: SemanticsConfiguration = semanticsConfiguration
         }
-        val semanticsModifierElement1 = modifierElementOf(null, { semanticsModifier1 }, { }, { })
-        val semanticsModifierElement2 = modifierElementOf(null, { semanticsModifier2 }, { }, { })
+        data class TestSemanticsModifierElement(
+            private val node: Modifier.Node
+        ) : ModifierNodeElement<Modifier.Node>() {
+            override fun create() = node
+            override fun update(node: Modifier.Node) = node
+        }
+        val semanticsModifierElement1 = TestSemanticsModifierElement(semanticsModifier1)
+        val semanticsModifierElement2 = TestSemanticsModifierElement(semanticsModifier2)
         val layoutNode1 = LayoutNode(0, 0, 5, 5, semanticsModifierElement1, DpSize(48.dp, 48.dp))
         val layoutNode2 = LayoutNode(6, 6, 11, 11, semanticsModifierElement2, DpSize(48.dp, 48.dp))
         val outerNode = LayoutNode(0, 0, 11, 11).apply { attach(MockOwner()) }
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt
new file mode 100644
index 0000000..eeffd8a
--- /dev/null
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierNodeElementTest.kt
@@ -0,0 +1,98 @@
+/*
+ * 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.ui.node
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.InspectableValue
+import androidx.compose.ui.platform.ValueElement
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@OptIn(ExperimentalComposeUiApi::class)
+@RunWith(JUnit4::class)
+class ModifierNodeElementTest {
+
+    @Test
+    fun testDefaultInspectableProperties() {
+        @Suppress("unused", "UNUSED_PARAMETER")
+        class AModifierElement(
+            val string: String,
+            val int: Int,
+            val map: Map<String, Any>,
+            inputParameter: Boolean
+        ) : ModifierNodeElement<Modifier.Node>() {
+            var classProperty = 0
+            override fun create() = object : Modifier.Node() {}
+            override fun update(node: Modifier.Node) = node
+            // We don't use equals or hashCode in this test, so bad implementations are okay.
+            override fun hashCode() = 0
+            override fun equals(other: Any?) = (this === other)
+        }
+
+        val modifier = AModifierElement(
+            string = "parameter 1",
+            int = 12345,
+            map = mapOf("key" to "value"),
+            inputParameter = true
+        ).apply {
+            classProperty = 42
+        }
+
+        assertEquals(
+            "The modifier's inspectable value was not automatically populated as expected",
+            expectedName = "AModifierElement",
+            expectedValue = null,
+            expectedProperties = listOf(
+                ValueElement("classProperty", 42),
+                ValueElement("int", 12345),
+                ValueElement("map", mapOf("key" to "value")),
+                ValueElement("string", "parameter 1"),
+            ),
+            actual = modifier
+        )
+    }
+
+    @Suppress("SameParameterValue")
+    private fun assertEquals(
+        message: String,
+        expectedName: String? = null,
+        expectedValue: Any? = null,
+        expectedProperties: List<ValueElement> = emptyList(),
+        actual: InspectableValue
+    ) {
+        assertEquals(
+            "$message (unexpected name)",
+            expectedName,
+            actual.nameFallback
+        )
+
+        assertEquals(
+            "$message (unexpected value)",
+            expectedValue,
+            actual.valueOverride
+        )
+
+        assertEquals(
+            "$message (unexpected properties)",
+            expectedProperties,
+            actual.inspectableElements.toList()
+        )
+    }
+}
\ No newline at end of file
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/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
index 9de574d..ba426db 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
@@ -19,6 +19,7 @@
 import android.view.View
 import android.view.inputmethod.ExtractedText
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Executor
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.cancel
@@ -37,7 +38,8 @@
 
     private val view = mock<View>()
     private val inputMethodManager = TestInputMethodManager()
-    private val service = TextInputServiceAndroid(view, inputMethodManager)
+    private val executor = Executor { runnable -> scope.launch { runnable.run() } }
+    private val service = TextInputServiceAndroid(view, inputMethodManager, executor)
     private val dispatcher = StandardTestDispatcher()
     private val scope = TestScope(dispatcher + Job())
 
@@ -45,7 +47,6 @@
     fun setUp() {
         // Default the view to focused because when it's not focused commands should be ignored.
         whenever(view.isFocused).thenReturn(true)
-        scope.launch { service.textInputCommandEventLoop() }
     }
 
     @After
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..1edc7e6 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,12 +25,14 @@
 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
 
     override val issues = listOf(
-        ConstraintLayoutDslDetector.IncorrectReferencesDeclarationIssue
+        ConstraintLayoutDslDetector.IncorrectReferencesDeclarationIssue,
+        ConstraintLayoutDslDetector.IncorrectMatchParentUsageIssue,
+        ConstraintLayoutDslDetector.IncorrectChainMarginsUsageIssue
     )
 
     override val vendor = Vendor(
diff --git a/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutDslDetector.kt b/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutDslDetector.kt
index 647017d..81058d4 100644
--- a/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutDslDetector.kt
+++ b/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutDslDetector.kt
@@ -24,32 +24,231 @@
 import com.android.tools.lint.detector.api.Implementation
 import com.android.tools.lint.detector.api.Issue
 import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.LintFix
 import com.android.tools.lint.detector.api.Scope
 import com.android.tools.lint.detector.api.Severity
 import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.UastLintUtils.Companion.tryResolveUDeclaration
 import java.util.EnumSet
 import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
 import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
+import org.jetbrains.uast.UBinaryExpression
+import org.jetbrains.uast.UBlockExpression
 import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UExpression
+import org.jetbrains.uast.ULambdaExpression
+import org.jetbrains.uast.UQualifiedReferenceExpression
+import org.jetbrains.uast.USimpleNameReferenceExpression
+import org.jetbrains.uast.getContainingUClass
+import org.jetbrains.uast.getParentOfType
+import org.jetbrains.uast.visitor.UastVisitor
+
+private const val CREATE_REFS_FOR_NAME = "createRefsFor"
+private const val MATCH_PARENT_NAME = "matchParent"
+private const val LINK_TO_NAME = "linkTo"
+private const val CENTER_TO_NAME = "centerTo"
+private const val CENTER_HORIZONTALLY_TO_NAME = "centerHorizontallyTo"
+private const val CENTER_VERTICALLY_TO_NAME = "centerVerticallyTo"
+private const val WIDTH_NAME = "width"
+private const val HEIGHT_NAME = "height"
+private const val PARENT_NAME = "parent"
+private const val CONSTRAIN_NAME = "constrain"
+private const val MARGIN_INDEX_IN_LINK_TO = 1
+private const val GONE_MARGIN_INDEX_IN_LINK_TO = 2
+private const val CREATE_HORIZONTAL_CHAIN_NAME = "createHorizontalChain"
+private const val CREATE_VERTICAL_CHAIN_NAME = "createVerticalChain"
+private const val WITH_CHAIN_PARAMS_NAME = "withChainParams"
+private const val CHAIN_PARAM_START_MARGIN_NAME = "startMargin"
+private const val CHAIN_PARAM_TOP_MARGIN_NAME = "topMargin"
+private const val CHAIN_PARAM_END_MARGIN_NAME = "endMargin"
+private const val CHAIN_PARAM_BOTTOM_MARGIN_NAME = "bottomMargin"
+private const val CHAIN_PARAM_START_GONE_MARGIN_NAME = "startGoneMargin"
+private const val CHAIN_PARAM_TOP_GONE_MARGIN_NAME = "topGoneMargin"
+private const val CHAIN_PARAM_END_GONE_MARGIN_NAME = "endGoneMargin"
+private const val CHAIN_PARAM_BOTTOM_GONE_MARGIN_NAME = "bottomGoneMargin"
+
+private const val CL_COMPOSE_DIMENSION_CLASS_NAME = "Dimension"
+
+private const val DIMENSION_MATCH_PARENT_EXPRESSION_NAME =
+    "$CL_COMPOSE_DIMENSION_CLASS_NAME.$MATCH_PARENT_NAME"
 
 private const val CL_COMPOSE_PACKAGE = "androidx.constraintlayout.compose"
 private const val CONSTRAINT_SET_SCOPE_CLASS_FQ = "$CL_COMPOSE_PACKAGE.ConstraintSetScope"
 private const val MOTION_SCENE_SCOPE_CLASS_FQ = "$CL_COMPOSE_PACKAGE.MotionSceneScope"
-private const val CREATE_REFS_FOR_NAME = "createRefsFor"
+private const val CONSTRAIN_SCOPE_CLASS_FQ = "$CL_COMPOSE_PACKAGE.ConstrainScope"
+private const val CONSTRAINED_LAYOUT_REFERENCE_CLASS_FQ =
+    "$CL_COMPOSE_PACKAGE.ConstrainedLayoutReference"
+private const val LAYOUT_REFERENCE_CLASS_FQ = "$CL_COMPOSE_PACKAGE.LayoutReference"
 
-class ConstraintLayoutDslDetector : Detector(), SourceCodeScanner {
-    private val knownOwnersOfCreateRefsFor = setOf(
+private val knownOwnersOfCreateRefsFor by lazy(LazyThreadSafetyMode.NONE) {
+    setOf(
         CONSTRAINT_SET_SCOPE_CLASS_FQ,
         MOTION_SCENE_SCOPE_CLASS_FQ
     )
+}
 
-    override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
+private val horizontalConstraintAnchors by lazy(LazyThreadSafetyMode.NONE) {
+    setOf(
+        "start",
+        "end",
+        "absoluteLeft",
+        "absoluteRight"
+    )
+}
+
+private val verticalConstraintAnchors by lazy(LazyThreadSafetyMode.NONE) {
+    setOf(
+        "top",
+        "bottom",
+    )
+}
+
+private val horizontalCenterMethodNames by lazy(LazyThreadSafetyMode.NONE) {
+    setOf(
+        CENTER_TO_NAME,
+        CENTER_HORIZONTALLY_TO_NAME,
+    )
+}
+
+private val verticalCenterMethodNames by lazy(LazyThreadSafetyMode.NONE) {
+    setOf(
+        CENTER_TO_NAME,
+        CENTER_VERTICALLY_TO_NAME,
+    )
+}
+
+class ConstraintLayoutDslDetector : Detector(), SourceCodeScanner {
+
+    // TODO: Add a case to detect use cases for `ConstrainedLayoutReference.withChainParams()`
+
+    override fun getApplicableUastTypes() =
+        listOf(UCallExpression::class.java, UBinaryExpression::class.java)
 
     override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
+
+        /**
+         * Binary expressions are of the form `foo = bar`.
+         */
+        override fun visitBinaryExpression(node: UBinaryExpression) {
+            val assignedReferenceText = node.rightOperand.sourcePsi?.text ?: return
+
+            when (assignedReferenceText) {
+                DIMENSION_MATCH_PARENT_EXPRESSION_NAME -> detectMatchParentUsage(node)
+            }
+        }
+
         override fun visitCallExpression(node: UCallExpression) {
-            if (node.methodName != CREATE_REFS_FOR_NAME) {
+            when (node.methodName) {
+                CREATE_REFS_FOR_NAME -> detectCreateRefsForUsage(node)
+                CREATE_HORIZONTAL_CHAIN_NAME -> detectChainParamsUsage(node, true)
+                CREATE_VERTICAL_CHAIN_NAME -> detectChainParamsUsage(node, false)
+                // TODO: Detect that `withChainParams` is not called after chains are created
+            }
+        }
+
+        /**
+         * Verify correct usage of `Dimension.matchParent`.
+         *
+         * &nbsp;
+         *
+         * When using `Dimension.matchParent`, the user must be careful to not have custom
+         * constraints that result in different behavior from `centerTo(parent)`, otherwise, they
+         * should use `Dimension.percent(1f)` instead.
+         * ```
+         *  val (text, button) = createRefsFor("text", "button")
+         *  constrain(text) {
+         *      width = Dimension.matchParent
+         *
+         *      // Correct
+         *      start.linkTo(parent.start)
+         *      centerTo(parent)
+         *      centerHorizontallyTo(parent)
+         *
+         *      // Incorrect
+         *      start.linkTo(parent.end)
+         *      start.linkTo(button.start)
+         *      centerHorizontallyTo(button)
+         *      centerTo(button)
+         *  }
+         * ```
+         *
+         */
+        private fun detectMatchParentUsage(node: UBinaryExpression) {
+            val assigneeNode = node.leftOperand
+            val assigneeName = assigneeNode.sourcePsi?.text ?: return
+
+            // Must be assigned to either `width` or `height`
+            val isHorizontal: Boolean = when (assigneeName) {
+                WIDTH_NAME -> true
+                HEIGHT_NAME -> false
+                else -> return
+            }
+
+            // Verify that the context of this Expression is within ConstrainScope
+            if (assigneeNode.tryResolveUDeclaration()
+                    ?.getContainingUClass()?.qualifiedName != CONSTRAIN_SCOPE_CLASS_FQ
+            ) {
                 return
             }
+
+            val containingBlock = node.getParentOfType<UBlockExpression>() ?: return
+
+            // Within the Block, look for expressions supported for the check and immediately return
+            // if any of those expressions indicate bad usage of `Dimension.matchParent`
+            val containsErrorProneUsage = containingBlock.expressions.asSequence()
+                .mapNotNull { expression ->
+                    EvaluateableExpression.createForMatchParentUsage(
+                        expression = expression,
+                        isHorizontal = isHorizontal
+                    )
+                }
+                .any(EvaluateableExpression::isErrorProneForMatchParentUsage)
+
+            if (!containsErrorProneUsage) {
+                return
+            }
+
+            val overrideMethodName =
+                if (isHorizontal) CENTER_HORIZONTALLY_TO_NAME else CENTER_VERTICALLY_TO_NAME
+
+            context.report(
+                issue = IncorrectMatchParentUsageIssue,
+                scope = node.rightOperand,
+                location = context.getNameLocation(node.rightOperand),
+                message = "`Dimension.matchParent` will override constraints to an equivalent of " +
+                    "`$overrideMethodName(parent)`.\nUse `Dimension.percent(1f)` to respect " +
+                    "constraints.",
+                quickfixData = LintFix.create()
+                    .replace()
+                    .name("Replace `matchParent` with `percent(1f)`.")
+                    .range(context.getNameLocation(node.rightOperand))
+                    .all()
+                    .with("Dimension.percent(1f)")
+                    .autoFix()
+                    .build()
+            )
+        }
+
+        /**
+         * Verify correct usage of `createRefsFor("a", "b", "c")`.
+         *
+         * &nbsp;
+         *
+         * The number of assigned variables should match the number of given arguments:
+         * ```
+         * // Correct
+         * val (a, b, c) = createRefsFor("a", "b", "c")
+         *
+         * // Incorrect: Fewer variables than arguments
+         * val (a) = createRefsFor("a", "b", "c")
+         *
+         * // Incorrect: More variables than arguments
+         * val (a, b, c, d) = createRefsFor("a", "b", "c")
+         *
+         * ```
+         */
+        private fun detectCreateRefsForUsage(node: UCallExpression) {
             val destructuringDeclarationElement =
                 node.sourcePsi?.getParentOfType<KtDestructuringDeclaration>(true) ?: return
 
@@ -84,6 +283,140 @@
                     "assigned variables ($varsReceived)"
             )
         }
+
+        /**
+         * Verify that margins for chains are applied correctly.
+         *
+         * &nbsp;
+         *
+         * Margins for elements in chains should be applied with `LayoutReference.withChainParams()`
+         * instinctively, users may want to create constraints with margins that mimic the chain
+         * behavior expecting those margins to be reflected in the chain. But that is not the
+         * correct way to do it.
+         *
+         * So this check detects when users create chain-like constraints, and suggests to use
+         * `withChainParams()` and delete conflicting constraints, keeping the intended margins.
+         *
+         * &nbsp;
+         *
+         * Example:
+         *
+         * Before
+         * ```
+         * val (button, text) = createRefs()
+         * createHorizontalChain(button, text)
+         *
+         * constrain(button) {
+         *  end.linkTo(text.start, 8.dp)
+         *  end.linkTo(text.start, goneMargin = 16.dp)
+         * }
+         * ```
+         *
+         * After
+         * ```
+         * val (button, text) = createRefs()
+         * createHorizontalChain(button.withChainParams(endMargin = 8.dp, endGoneMargin = 16.dp), text)
+         *
+         * constrain(button) {
+         * }
+         * ```
+         */
+        private fun detectChainParamsUsage(node: UCallExpression, isHorizontal: Boolean) {
+            // TODO(b/268213648): Don't attempt to fix chain elements that already have
+            //  `withChainParams` that may have been defined elsewhere out of scope. A safe
+            //  path to take would be to look for the layout reference declaration, and skip this
+            //  check if it cannot be found within the current scope (code block). We could also try
+            //  to search within the shared scope of the layout reference and chain declarations,
+            //  but there's no straight-forward way to do it.
+
+            val containingBlock = node.getParentOfType<UBlockExpression>() ?: return
+
+            var previousNode: ChainNode? = null
+            val chainNodes = node.valueArguments
+                .filter(UExpression::isOfLayoutReferenceType)
+                .mapNotNull { argumentExpression ->
+                    argumentExpression.findChildIdentifier()?.let { identifier ->
+                        val chainNode = ChainNode(
+                            expression = identifier,
+                            hasChainParams = argumentExpression is UQualifiedReferenceExpression ||
+                                containingBlock.isChainParamsCalledInIdentifier(identifier)
+                        )
+                        previousNode?.let { prevNode ->
+                            chainNode.prev = prevNode
+                            prevNode.next = chainNode
+                        }
+                        previousNode = chainNode
+                        chainNode
+                    }
+                }
+
+            val resolvedChainLikeConstraintsPerNode = chainNodes.map {
+                if (it.hasChainParams) {
+                    emptyList()
+                } else {
+                    findChainLikeConstraints(containingBlock, it, isHorizontal)
+                }
+            }
+            resolvedChainLikeConstraintsPerNode.forEachIndexed { index, chainLikeExpressions ->
+                val chainParamsBuilder = ChainParamsMethodBuilder()
+                val removeLinkToFixes = chainLikeExpressions.map { resolvedExpression ->
+                    resolvedExpression.marginExpression?.let {
+                        chainParamsBuilder.append(
+                            resolvedExpression.marginParamName,
+                            resolvedExpression.marginExpression
+                        )
+                    }
+                    resolvedExpression.marginGoneExpression?.let {
+                        chainParamsBuilder.append(
+                            resolvedExpression.marginGoneParamName,
+                            resolvedExpression.marginGoneExpression
+                        )
+                    }
+                    val expressionToDelete =
+                        resolvedExpression
+                            .fullExpression
+                            .getParentOfType<UQualifiedReferenceExpression>()
+                    LintFix.create()
+                        .replace()
+                        .name("Remove conflicting `linkTo` declaration.")
+                        .range(context.getLocation(expressionToDelete))
+                        .all()
+                        .with("")
+                        .autoFix()
+                        .build()
+                }
+                val chainNode = chainNodes[index]
+                if (!chainParamsBuilder.isEmpty() && removeLinkToFixes.isNotEmpty()) {
+                    context.report(
+                        issue = IncorrectChainMarginsUsageIssue,
+                        scope = node,
+                        location = context.getLocation(chainNode.expression.sourcePsi),
+                        message = "Margins for elements in a Chain should be applied with " +
+                            "`LayoutReference.withChainParams(...)`.",
+                        quickfixData = LintFix.create()
+                            .composite()
+                            .name(
+                                "Add `.withChainParams(...)` and remove " +
+                                    "(${removeLinkToFixes.size}) conflicting `linkTo` declarations."
+                            )
+                            // `join` might overwrite previously added fixes, so add grouped fixes
+                            // first, then, add the remaining fixes individually with `add`
+                            .join(*removeLinkToFixes.toTypedArray())
+                            .add(
+                                LintFix.create()
+                                    .replace()
+                                    .name("Add `.withChainParams(...)`.")
+                                    .range(context.getLocation(chainNode.expression.sourcePsi))
+                                    .end()
+                                    .with(chainParamsBuilder.build())
+                                    .autoFix()
+                                    .build()
+                            )
+                            .build()
+                    )
+                }
+            }
+        }
     }
 
     companion object {
@@ -103,5 +436,328 @@
                 EnumSet.of(Scope.JAVA_FILE)
             )
         )
+
+        val IncorrectMatchParentUsageIssue = Issue.create(
+            id = "IncorrectMatchParentUsage",
+            briefDescription = "Prefer using `Dimension.percent(1f)` when defining custom " +
+                "constraints.",
+            explanation = "`Dimension.matchParent` forces the constraints to be an equivalent of " +
+                "`centerHorizontallyTo(parent)` or `centerVerticallyTo(parent)` according to the " +
+                "assigned dimension which can lead to unexpected behavior. To avoid that, prefer " +
+                "using `Dimension.percent(1f)`",
+            category = Category.CORRECTNESS,
+            priority = 5,
+            severity = Severity.WARNING,
+            implementation = Implementation(
+                ConstraintLayoutDslDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE)
+            )
+        )
+
+        val IncorrectChainMarginsUsageIssue = Issue.create(
+            id = "IncorrectChainMarginsUsage",
+            briefDescription = "Use `LayoutReference.withChainParams()` to define margins for " +
+                "elements in a Chain.",
+            explanation = "If you understand how a chain works, it might seem obvious to add " +
+                "margins by re-creating the constraints with the desired margin. However, in " +
+                "Compose, helpers will ignore custom constraints in favor of their layout " +
+                "implementation. So instead, use `LayoutReference.withChainParams()` " +
+                "to define margins for Chains.",
+            category = Category.CORRECTNESS,
+            priority = 5,
+            severity = Severity.WARNING,
+            implementation = Implementation(
+                ConstraintLayoutDslDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE)
+            )
+        )
     }
+}
+
+internal class EvaluateableExpression(
+    private val expectedArgumentText: String,
+    private val expression: UCallExpression
+) {
+    /**
+     * Should only return `true` when we know for certain that there's wrong usage.
+     *
+     * &nbsp;
+     *
+     * E.g.: For the following snippet we can't know if usage is incorrect since we don't know what
+     * the variable `targetAnchor` represents.
+     * ```
+     * width = Dimension.matchParent
+     *
+     * var targetAnchor: HorizontalAnchor
+     * start.linkTo(targetAnchor)
+     * ```
+     */
+    fun isErrorProneForMatchParentUsage(): Boolean {
+        val argumentText = expression.valueArguments.firstOrNull()?.sourcePsi?.text ?: return false
+        return argumentText != expectedArgumentText
+    }
+
+    companion object {
+        fun createForMatchParentUsage(
+            expression: UExpression,
+            isHorizontal: Boolean
+        ): EvaluateableExpression? {
+            if (expression is UQualifiedReferenceExpression) {
+                // For the form of `start.linkTo(parent.start)`
+
+                val callExpression = (expression.selector as? UCallExpression) ?: return null
+                if (callExpression.methodName != LINK_TO_NAME) {
+                    return null
+                }
+                val receiverAnchorName = expression.receiver.sourcePsi?.text ?: return null
+                val supportedAnchors =
+                    if (isHorizontal) horizontalConstraintAnchors else verticalConstraintAnchors
+                if (!supportedAnchors.contains(receiverAnchorName)) {
+                    return null
+                }
+                return EvaluateableExpression(
+                    expectedArgumentText = "$PARENT_NAME.$receiverAnchorName",
+                    expression = callExpression
+                )
+            } else if (expression is UCallExpression) {
+                // For the form of `centerTo(parent)`
+
+                val supportedMethodNames =
+                    if (isHorizontal) horizontalCenterMethodNames else verticalCenterMethodNames
+                val methodName = expression.methodName ?: return null
+                if (!supportedMethodNames.contains(methodName)) {
+                    return null
+                }
+                return EvaluateableExpression(
+                    expectedArgumentText = PARENT_NAME,
+                    expression = expression
+                )
+            }
+            return null
+        }
+    }
+}
+
+internal fun findChainLikeConstraints(
+    constraintSetBlock: UBlockExpression,
+    chainNode: ChainNode,
+    isHorizontal: Boolean
+): List<ResolvedChainLikeExpression> {
+    val identifier = chainNode.expression
+    val constrainTargetExpressions = constraintSetBlock.expressions.filter { cSetExpression ->
+        cSetExpression is UCallExpression && cSetExpression.methodName == CONSTRAIN_NAME &&
+            cSetExpression.valueArguments.any { argument ->
+                argument.sourcePsi?.text == identifier.identifier
+            }
+    }
+
+    val expectedAnchors =
+        if (isHorizontal) horizontalConstraintAnchors else verticalConstraintAnchors
+
+    return constrainTargetExpressions.asSequence().mapNotNull { constrainExpression ->
+        (constrainExpression as? UCallExpression)
+            ?.valueArguments
+            ?.filterIsInstance<ULambdaExpression>()
+            ?.lastOrNull()?.body as? UBlockExpression
+    }.flatMap {
+        it.expressions
+    }.filterIsInstance<UQualifiedReferenceExpression>().map {
+        it.selector
+    }.filterIsInstance<UCallExpression>().filter {
+        // No point in considering it if there's no margins applied
+        it.methodName == LINK_TO_NAME && it.valueArgumentCount >= 2
+    }.mapNotNull {
+        it.receiver?.sourcePsi?.text?.let { anchorName ->
+            if (expectedAnchors.contains(anchorName)) {
+                Pair(it, anchorName)
+            } else {
+                null
+            }
+        }
+    }.mapNotNull { (linkCallExpression, anchorName) ->
+        val nextIdentifier = chainNode.next?.expression?.identifier
+        val isNextParent = nextIdentifier == null
+
+        val prevIdentifier = chainNode.prev?.expression?.identifier
+        val isPrevParent = prevIdentifier == null
+        val expectedNextAnchorTo =
+            if (isNextParent) {
+                "parent.$anchorName"
+            } else {
+                "${nextIdentifier!!}.${anchorName.getOppositeAnchorName()}"
+            }
+        val expectedPrevAnchorTo =
+            if (isPrevParent) {
+                "parent.$anchorName"
+            } else {
+                "${prevIdentifier!!}.${anchorName.getOppositeAnchorName()}"
+            }
+
+        val targetAnchorExpressionText =
+            linkCallExpression.valueArguments[0].sourcePsi?.text
+        if (targetAnchorExpressionText == expectedPrevAnchorTo ||
+            targetAnchorExpressionText == expectedNextAnchorTo
+        ) {
+            ResolvedChainLikeExpression(
+                linkCallExpression,
+                anchorName,
+                linkCallExpression.getArgumentForParameter(MARGIN_INDEX_IN_LINK_TO),
+                linkCallExpression.getArgumentForParameter(GONE_MARGIN_INDEX_IN_LINK_TO)
+            )
+        } else {
+            null
+        }
+    }.toList()
+}
+
+internal class ChainNode(
+    val expression: USimpleNameReferenceExpression,
+    val hasChainParams: Boolean
+) {
+    var prev: ChainNode? = null
+    var next: ChainNode? = null
+}
+
+internal class ResolvedChainLikeExpression(
+    val fullExpression: UCallExpression,
+    anchorName: String,
+    val marginExpression: UExpression?,
+    val marginGoneExpression: UExpression?
+) {
+    val marginParamName: String = anchorName.asChainParamsArgument(false)
+    val marginGoneParamName: String = anchorName.asChainParamsArgument(true)
+}
+
+private fun String.getOppositeAnchorName() =
+    when (this) {
+        "start" -> "end"
+        "end" -> "start"
+        "absoluteLeft" -> "absoluteRight"
+        "absoluteRight" -> "absoluteLeft"
+        "top" -> "bottom"
+        "bottom" -> "top"
+        else -> "start"
+    }
+
+internal fun String.asChainParamsArgument(isGone: Boolean = false) =
+    if (!isGone) {
+        when (this) {
+            "absoluteLeft",
+            "start" -> CHAIN_PARAM_START_MARGIN_NAME
+
+            "absoluteRight",
+            "end" -> CHAIN_PARAM_END_MARGIN_NAME
+
+            "top" -> CHAIN_PARAM_TOP_MARGIN_NAME
+            "bottom" -> CHAIN_PARAM_BOTTOM_MARGIN_NAME
+            else -> CHAIN_PARAM_START_MARGIN_NAME
+        }
+    } else {
+        when (this) {
+            "absoluteLeft",
+            "start" -> CHAIN_PARAM_START_GONE_MARGIN_NAME
+
+            "absoluteRight",
+            "end" -> CHAIN_PARAM_END_GONE_MARGIN_NAME
+
+            "top" -> CHAIN_PARAM_TOP_GONE_MARGIN_NAME
+            "bottom" -> CHAIN_PARAM_BOTTOM_GONE_MARGIN_NAME
+            else -> CHAIN_PARAM_START_GONE_MARGIN_NAME
+        }
+    }
+
+internal fun UBlockExpression.isChainParamsCalledInIdentifier(
+    target: USimpleNameReferenceExpression
+): Boolean {
+    var found = false
+    this.accept(
+        object : UastVisitor {
+            override fun visitQualifiedReferenceExpression(
+                node: UQualifiedReferenceExpression
+            ): Boolean {
+                val identifier = (node.receiver as? USimpleNameReferenceExpression) ?: return true
+                if (identifier.identifier == target.identifier &&
+                    identifier.getExpressionType() == target.getExpressionType()) {
+                    val selector = node.selector
+                    if (selector is UCallExpression &&
+                        selector.methodName == WITH_CHAIN_PARAMS_NAME) {
+                        found = true
+                    } else {
+                        // skip
+                        return true
+                    }
+                } else {
+                    // skip
+                    return true
+                }
+                return super.visitQualifiedReferenceExpression(node)
+            }
+
+            override fun visitElement(node: UElement): Boolean {
+                return found
+            }
+        }
+    )
+    return found
+}
+
+internal class ChainParamsMethodBuilder {
+    private val modificationMap = mutableMapOf<String, UExpression>()
+
+    fun append(paramName: String, paramExpression: UExpression) {
+        modificationMap[paramName] = paramExpression
+    }
+
+    fun isEmpty() = modificationMap.isEmpty()
+
+    fun build(): String =
+        StringBuilder().apply {
+            append('.')
+            append(WITH_CHAIN_PARAMS_NAME)
+            append('(')
+            modificationMap.forEach { (paramName, uExpression) ->
+                uExpression.sourcePsi?.text?.let {
+                    append("$paramName = $it")
+                    append(", ")
+                }
+            }
+            deleteCharAt(this.lastIndex)
+            deleteCharAt(this.lastIndex)
+            append(')')
+        }.toString()
+}
+
+internal fun UExpression.findChildIdentifier(): USimpleNameReferenceExpression? {
+    var identifier: USimpleNameReferenceExpression? = null
+    this.accept(
+        object : UastVisitor {
+            override fun visitSimpleNameReferenceExpression(
+                node: USimpleNameReferenceExpression
+            ): Boolean {
+                if (node.isOfLayoutReferenceType()) {
+                    identifier = node
+                }
+                return true
+            }
+
+            // Only supported element to visit recursively, for the form of `textRef.withChainParams()`
+            override fun visitQualifiedReferenceExpression(
+                node: UQualifiedReferenceExpression
+            ): Boolean = false
+
+            override fun visitElement(node: UElement): Boolean = true
+        }
+    )
+    return identifier
+}
+
+/**
+ * Simple way to check if the Reference has a supported LayoutReference type. Note it does not do
+ * expression resolution and takes the type as is. So we have to manually check for inheritors of
+ * LayoutReference.
+ */
+internal fun UExpression.isOfLayoutReferenceType(): Boolean {
+    val typeName = this.getExpressionType()?.canonicalText ?: return false
+    return typeName == CONSTRAINED_LAYOUT_REFERENCE_CLASS_FQ ||
+        typeName == LAYOUT_REFERENCE_CLASS_FQ
 }
\ No newline at end of file
diff --git a/constraintlayout/constraintlayout-compose/api/current.txt b/constraintlayout/constraintlayout-compose/api/current.txt
index 9b065fc..b0e909f 100644
--- a/constraintlayout/constraintlayout-compose/api/current.txt
+++ b/constraintlayout/constraintlayout-compose/api/current.txt
@@ -138,8 +138,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional int[] rowWeights, optional float verticalGap, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional int[] rowWeights, optional float verticalGap, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float padding, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float paddingHorizontal, optional float paddingVertical, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
@@ -160,8 +160,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float offset);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float fraction);
     method public final androidx.constraintlayout.compose.HorizontalChainReference createHorizontalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.VerticalChainReference createVerticalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
@@ -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..fe6d261 100644
--- a/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt
+++ b/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt
@@ -173,8 +173,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional int[] rowWeights, optional float verticalGap, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional int[] rowWeights, optional float verticalGap, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float padding, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float paddingHorizontal, optional float paddingVertical, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
@@ -195,8 +195,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float offset);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float fraction);
     method public final androidx.constraintlayout.compose.HorizontalChainReference createHorizontalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.VerticalChainReference createVerticalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
@@ -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..75753a2 100644
--- a/constraintlayout/constraintlayout-compose/api/restricted_current.txt
+++ b/constraintlayout/constraintlayout-compose/api/restricted_current.txt
@@ -145,8 +145,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteLeftBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createAbsoluteRightBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createBottomBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional int[] rowWeights, optional float verticalGap, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional int[] rowWeights, optional float verticalGap, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createColumn(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float verticalGap, optional int[] rowWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createEndBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float padding, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
     method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createFlow(androidx.constraintlayout.compose.LayoutReference![]? elements, optional boolean flowVertically, optional float verticalGap, optional float horizontalGap, optional int maxElement, optional float paddingHorizontal, optional float paddingVertical, optional androidx.constraintlayout.compose.Wrap wrapMode, optional androidx.constraintlayout.compose.VerticalAlign verticalAlign, optional androidx.constraintlayout.compose.HorizontalAlign horizontalAlign, optional float horizontalFlowBias, optional float verticalFlowBias, optional androidx.constraintlayout.compose.FlowStyle verticalStyle, optional androidx.constraintlayout.compose.FlowStyle horizontalStyle);
@@ -167,8 +167,8 @@
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float offset);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createGuidelineFromTop(float fraction);
     method public final androidx.constraintlayout.compose.HorizontalChainReference createHorizontalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float padding);
-    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float padding);
+    method public final androidx.constraintlayout.compose.ConstrainedLayoutReference createRow(androidx.constraintlayout.compose.LayoutReference![] elements, optional String spans, optional String skips, optional float horizontalGap, optional int[] columnWeights, optional float paddingHorizontal, optional float paddingVertical);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.VerticalAnchor createStartBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.ConstraintLayoutBaseScope.HorizontalAnchor createTopBarrier(androidx.constraintlayout.compose.LayoutReference![] elements, optional float margin);
     method public final androidx.constraintlayout.compose.VerticalChainReference createVerticalChain(androidx.constraintlayout.compose.LayoutReference![] elements, optional androidx.constraintlayout.compose.ChainStyle chainStyle);
@@ -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/RowColumnDslTest.kt b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnDslTest.kt
index 79e7534..bf64550 100644
--- a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnDslTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnDslTest.kt
@@ -57,12 +57,14 @@
     }
 
     @Test
-    fun testColumns() {
+    fun testColumn() {
         val rootSize = 200.dp
         val boxesCount = 4
         rule.setContent {
             ColumnComposableTest(
                 modifier = Modifier.size(rootSize),
+                gridSkips = "",
+                gridSpans = "",
                 boxesCount = boxesCount,
                 vGap = 0,
                 gridRowWeights = intArrayOf(),
@@ -87,12 +89,80 @@
     }
 
     @Test
-    fun testRows() {
+    fun testColumnSkips() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            ColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                gridSkips = "1:2",
+                gridSpans = "",
+                boxesCount = boxesCount,
+                vGap = 0,
+                gridRowWeights = intArrayOf(),
+            )
+        }
+        var expectedX = 0.dp
+        var expectedY = 0.dp
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - 10.dp) / 2f
+        val vGapSize = (rootSize - (10.dp * 6f)) / ((boxesCount + 2) * 2f)
+        rule.waitForIdle()
+        expectedX += hGapSize
+        expectedY += vGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        expectedY += vGapSize + vGapSize + 10.dp
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testColumnSpans() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            ColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                gridSkips = "",
+                gridSpans = "0:2",
+                boxesCount = boxesCount,
+                vGap = 0,
+                gridRowWeights = intArrayOf(),
+            )
+        }
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - 10.dp) / 2f
+        val vGapSize = (rootSize - (10.dp * 5f)) / ((boxesCount + 1) * 2f)
+        val rowSize = 10.dp + vGapSize * 2
+        var expectedX = 0.dp
+        var expectedY = rowSize - 5.dp
+
+        expectedX += hGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += expectedY + vGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testRow() {
         val rootSize = 200.dp
         val boxesCount = 4
         rule.setContent {
             RowComposableTest(
                 modifier = Modifier.size(rootSize),
+                gridSkips = "",
+                gridSpans = "",
                 boxesCount = boxesCount,
                 hGap = 0,
                 gridColumnWeights = intArrayOf()
@@ -116,9 +186,78 @@
         rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
     }
 
+    @Test
+    fun testRowSkips() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowComposableTest(
+                modifier = Modifier.size(rootSize),
+                gridSkips = "1:2",
+                gridSpans = "",
+                boxesCount = boxesCount,
+                hGap = 0,
+                gridColumnWeights = intArrayOf()
+            )
+        }
+        var expectedX = 0.dp
+        var expectedY = 0.dp
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - (10.dp * 6f)) / ((boxesCount + 2) * 2f)
+        val vGapSize = (rootSize - 10.dp) / 2f
+        rule.waitForIdle()
+        expectedX += hGapSize
+        expectedY += vGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        expectedX += hGapSize + hGapSize + 10.dp
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testRowSpans() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowComposableTest(
+                modifier = Modifier.size(rootSize),
+                gridSkips = "",
+                gridSpans = "0:2",
+                boxesCount = boxesCount,
+                hGap = 0,
+                gridColumnWeights = intArrayOf()
+            )
+        }
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - (10.dp * 5f)) / ((boxesCount + 1) * 2f)
+        val vGapSize = (rootSize - 10.dp) / 2f
+        val columnSize = 10.dp + hGapSize * 2
+        var expectedX = columnSize - 5.dp
+        var expectedY = 0.dp
+
+        expectedY += vGapSize
+
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += expectedX + hGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
     @Composable
     private fun ColumnComposableTest(
         modifier: Modifier = Modifier,
+        gridSkips: String,
+        gridSpans: String,
         gridRowWeights: IntArray,
         boxesCount: Int,
         vGap: Int,
@@ -133,6 +272,8 @@
 
                 val g1 = createColumn(
                     elements = elem.toTypedArray(),
+                    skips = gridSkips,
+                    spans = gridSpans,
                     verticalGap = vGap.dp,
                     rowWeights = gridRowWeights,
                 )
@@ -159,6 +300,8 @@
     @Composable
     private fun RowComposableTest(
         modifier: Modifier = Modifier,
+        gridSkips: String,
+        gridSpans: String,
         gridColumnWeights: IntArray,
         boxesCount: Int,
         hGap: Int,
@@ -174,6 +317,8 @@
                 val g1 = createRow(
                     elements = elem.toTypedArray(),
                     horizontalGap = hGap.dp,
+                    skips = gridSkips,
+                    spans = gridSpans,
                     columnWeights = gridColumnWeights,
                 )
                 constrain(g1) {
diff --git a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnTest.kt b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnTest.kt
index 3dee3b0..85979d4 100644
--- a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/RowColumnTest.kt
@@ -57,7 +57,7 @@
     }
 
     @Test
-    fun testColumns() {
+    fun testColumn() {
         val rootSize = 200.dp
         val boxesCount = 4
         rule.setContent {
@@ -95,7 +95,84 @@
     }
 
     @Test
-    fun testRows() {
+    fun testColumnSkips() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                type = "'column'",
+                width = "'parent'",
+                height = "'parent'",
+                boxesCount = boxesCount,
+                orientation = 0,
+                hGap = 0,
+                vGap = 0,
+                spans = "''",
+                skips = "'1:2'",
+                rowWeights = "''",
+                columnWeights = "''"
+            )
+        }
+        var expectedX = 0.dp
+        var expectedY = 0.dp
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - 10.dp) / 2f
+        val vGapSize = (rootSize - (10.dp * 6f)) / ((boxesCount + 2) * 2f)
+        rule.waitForIdle()
+        expectedX += hGapSize
+        expectedY += vGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        expectedY += vGapSize + vGapSize + 10.dp
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testColumnSpans() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                type = "'column'",
+                width = "'parent'",
+                height = "'parent'",
+                boxesCount = boxesCount,
+                orientation = 0,
+                hGap = 0,
+                vGap = 0,
+                spans = "'0:2'",
+                skips = "''",
+                rowWeights = "''",
+                columnWeights = "''"
+            )
+        }
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - 10.dp) / 2f
+        val vGapSize = (rootSize - (10.dp * 5f)) / ((boxesCount + 1) * 2f)
+        val rowSize = 10.dp + vGapSize * 2
+        var expectedX = 0.dp
+        var expectedY = rowSize - 5.dp
+
+        expectedX += hGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += expectedY + vGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedY += vGapSize + vGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testRow() {
         val rootSize = 200.dp
         val boxesCount = 4
         rule.setContent {
@@ -132,6 +209,84 @@
         rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
     }
 
+    @Test
+    fun testRowSkips() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                type = "'row'",
+                width = "'parent'",
+                height = "'parent'",
+                boxesCount = boxesCount,
+                orientation = 0,
+                hGap = 0,
+                vGap = 0,
+                spans = "''",
+                skips = "'1:2'",
+                rowWeights = "''",
+                columnWeights = "''"
+            )
+        }
+        var expectedX = 0.dp
+        var expectedY = 0.dp
+
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - (10.dp * 6f)) / ((boxesCount + 2) * 2f)
+        val vGapSize = (rootSize - 10.dp) / 2f
+        rule.waitForIdle()
+        expectedX += hGapSize
+        expectedY += vGapSize
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        expectedX += hGapSize + hGapSize + 10.dp
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
+    @Test
+    fun testRowSpans() {
+        val rootSize = 200.dp
+        val boxesCount = 4
+        rule.setContent {
+            RowColumnComposableTest(
+                modifier = Modifier.size(rootSize),
+                type = "'row'",
+                width = "'parent'",
+                height = "'parent'",
+                boxesCount = boxesCount,
+                orientation = 0,
+                hGap = 0,
+                vGap = 0,
+                spans = "'0:2'",
+                skips = "''",
+                rowWeights = "''",
+                columnWeights = "''"
+            )
+        }
+        // 10.dp is the size of a singular box
+        val hGapSize = (rootSize - (10.dp * 5f)) / ((boxesCount + 1) * 2f)
+        val vGapSize = (rootSize - 10.dp) / 2f
+        val columnSize = 10.dp + hGapSize * 2
+        var expectedX = columnSize - 5.dp
+        var expectedY = 0.dp
+
+        expectedY += vGapSize
+
+        rule.onNodeWithTag("box0").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += expectedX + hGapSize + 10.dp
+        rule.onNodeWithTag("box1").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box2").assertPositionInRootIsEqualTo(expectedX, expectedY)
+        expectedX += hGapSize + hGapSize + 10.dp
+        rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, expectedY)
+    }
+
     @Composable
     private fun RowColumnComposableTest(
         modifier: Modifier = Modifier,
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayoutBaseScope.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayoutBaseScope.kt
index 02a2026..c3912d6 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayoutBaseScope.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayoutBaseScope.kt
@@ -703,6 +703,8 @@
      *      val weights = intArrayOf(3, 3, 2, 2, 1)
      *      val g1 = createRow(
      *          a, b, c, d, e,
+     *          spans = "1:2"
+     *          skips = "1:1,3:2",
      *          horizontalGap = 10.dp,
      *          columnWeights = weights,
      *          padding = 10.dp,
@@ -725,12 +727,16 @@
      *    }
      *
      * @param elements [LayoutReference]s to be laid out by the Grid helper
+     * @param spans specify area(s) in a Row to be spanned - format: positionxsize
+     * @param skips specify area(s) in a Row to be skipped - format: positionxsize
      * @param horizontalGap defines the gap between views in the x axis
      * @param columnWeights defines the weight of each column
      * @param padding sets padding around the content
      */
     fun createRow(
         vararg elements: LayoutReference,
+        spans: String = "",
+        skips: String = "",
         horizontalGap: Dp = 0.dp,
         columnWeights: IntArray = intArrayOf(),
         padding: Dp = 0.dp,
@@ -738,6 +744,8 @@
         return createGrid(
             elements = elements,
             rows = 1,
+            spans = spans,
+            skips = skips,
             horizontalGap = horizontalGap,
             columnWeights = columnWeights,
             paddingLeft = padding,
@@ -760,6 +768,8 @@
      *      val weights = intArrayOf(3, 3, 2, 2, 1)
      *      val g1 = createRow(
      *          a, b, c, d, e,
+     *          spans = "1:2"
+     *          skips = "1:1,3:2",
      *          horizontalGap = 10.dp,
      *          columnWeights = weights,
      *          paddingHorizontal = 10.dp,
@@ -783,6 +793,8 @@
      *   }
      *
      * @param elements [LayoutReference]s to be laid out by the Grid helper
+     * @param spans specify area(s) in a Row to be spanned - format: positionxsize
+     * @param skips specify area(s) in a Row to be skipped - format: positionxsize
      * @param horizontalGap defines the gap between views in the y axis
      * @param columnWeights defines the weight of each column
      * @param paddingHorizontal sets paddingLeft and paddingRight of the content
@@ -790,6 +802,8 @@
      */
     fun createRow(
         vararg elements: LayoutReference,
+        spans: String = "",
+        skips: String = "",
         horizontalGap: Dp = 0.dp,
         columnWeights: IntArray = intArrayOf(),
         paddingHorizontal: Dp = 0.dp,
@@ -798,6 +812,8 @@
         return createGrid(
             elements = elements,
             rows = 1,
+            spans = spans,
+            skips = skips,
             horizontalGap = horizontalGap,
             columnWeights = columnWeights,
             paddingLeft = paddingHorizontal,
@@ -820,6 +836,8 @@
      *      val weights = intArrayOf(3, 3, 2, 2, 1)
      *      val g1 = createColumn(
      *          a, b, c, d, e,
+     *          spans = "1:2"
+     *          skips = "1:1,3:2",
      *          verticalGap = 10.dp,
      *          rowWeights = weights,
      *          padding = 10.dp,
@@ -842,12 +860,16 @@
      *    }
      *
      * @param elements [LayoutReference]s to be laid out by the Grid helper
+     * @param spans specify area(s) in a Column to be spanned - format: positionxsize
+     * @param skips specify area(s) in a Column to be skipped - format: positionxsize
      * @param verticalGap defines the gap between views in the y axis
      * @param rowWeights defines the weight of each row
      * @param padding sets padding around the content
      */
     fun createColumn(
         vararg elements: LayoutReference,
+        spans: String = "",
+        skips: String = "",
         rowWeights: IntArray = intArrayOf(),
         verticalGap: Dp = 0.dp,
         padding: Dp = 0.dp,
@@ -855,6 +877,8 @@
         return createGrid(
             elements = elements,
             columns = 1,
+            spans = spans,
+            skips = skips,
             verticalGap = verticalGap,
             rowWeights = rowWeights,
             paddingLeft = padding,
@@ -877,6 +901,8 @@
      *      val weights = intArrayOf(3, 3, 2, 2, 1)
      *      val g1 = createColumn(
      *          a, b, c, d, e,
+     *          spans = "1:2"
+     *          skips = "1:1,3:2",
      *          verticalGap = 10.dp,
      *          rowWeights = weights,
      *          padding = 10.dp,
@@ -899,6 +925,8 @@
      *    }
      *
      * @param elements [LayoutReference]s to be laid out by the Grid helper
+     * @param spans specify area(s) in a Column to be spanned - format: positionxsize
+     * @param skips specify area(s) in a Column to be skipped - format: positionxsize
      * @param verticalGap defines the gap between views in the y axis
      * @param rowWeights defines the weight of each row
      * @param paddingHorizontal sets paddingLeft and paddingRight of the content
@@ -906,6 +934,8 @@
      */
     fun createColumn(
         vararg elements: LayoutReference,
+        spans: String = "",
+        skips: String = "",
         verticalGap: Dp = 0.dp,
         rowWeights: IntArray = intArrayOf(),
         paddingHorizontal: Dp = 0.dp,
@@ -914,6 +944,8 @@
         return createGrid(
             elements = elements,
             columns = 1,
+            spans = spans,
+            skips = skips,
             verticalGap = verticalGap,
             rowWeights = rowWeights,
             paddingLeft = paddingHorizontal,
diff --git a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
index ef32159..eb03ed5 100644
--- a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
+++ b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/ConstraintSetParser.java
@@ -979,13 +979,13 @@
                     break;
                 case "spans":
                     String spans = element.get(param).content();
-                    if (spans != null && spans.contains("x") && spans.contains(":")) {
+                    if (spans != null && spans.contains(":")) {
                         grid.setSpans(spans);
                     }
                     break;
                 case "skips":
                     String skips = element.get(param).content();
-                    if (skips != null && skips.contains("x") && skips.contains(":")) {
+                    if (skips != null && skips.contains(":")) {
                         grid.setSkips(skips);
                     }
                     break;
diff --git a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/utils/GridCore.java b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/utils/GridCore.java
index 5cbbe55..7f1153f 100644
--- a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/utils/GridCore.java
+++ b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/utils/GridCore.java
@@ -51,6 +51,11 @@
     private ConstraintWidget[] mBoxWidgets;
 
     /**
+     * Check if skips/spans of a Row or a Columns is handled
+     */
+    private boolean mExtraSpaceHandled = false;
+
+    /**
      * number of rows of the grid
      */
     private int mRows;
@@ -176,7 +181,7 @@
         if (mSpans != null && mSpans.equals(spans.toString())) {
             return;
         }
-
+        mExtraSpaceHandled = false;
         mSpans = spans.toString();
     }
 
@@ -189,7 +194,7 @@
         if (mSkips != null && mSkips.equals(skips)) {
             return;
         }
-
+        mExtraSpaceHandled = false;
         mSkips = skips;
 
     }
@@ -420,20 +425,25 @@
         }
 
         mNextAvailableIndex = 0;
-        createBoxes();
 
         if (mSkips != null && !mSkips.trim().isEmpty()) {
-            int[][] mSkips = parseSpans(this.mSkips);
+            int[][] mSkips = parseSpans(this.mSkips, false);
             if (mSkips != null) {
                 handleSkips(mSkips);
             }
         }
 
+        int[][] parsedSpans = null;
         if (mSpans != null && !mSpans.trim().isEmpty()) {
-            int[][] mSpans = parseSpans(this.mSpans);
-            if (mSpans != null) {
-                handleSpans(mSpans);
-            }
+            parsedSpans = parseSpans(this.mSpans, true);
+        }
+
+        // Need to create boxes before handleSpans since the spanned widgets would be
+        // constrained in this step.
+        createBoxes();
+
+        if (parsedSpans != null) {
+            handleSpans(parsedSpans);
         }
     }
 
@@ -788,21 +798,55 @@
      * col_span- the number of columns to span
      *
      * @param str string format of skips or spans
+     * @param isSpans whether is spans to be parsed (it is skips if not)
      * @return a int matrix that contains skip information.
      */
-    private int[][] parseSpans(String str) {
+    private int[][] parseSpans(String str, boolean isSpans) {
         try {
+            int extraRows = 0;
+            int extraColumns = 0;
             String[] spans = str.split(",");
             int[][] spanMatrix = new int[spans.length][3];
-
             String[] indexAndSpan;
-            String[] rowAndCol;
-            for (int i = 0; i < spans.length; i++) {
-                indexAndSpan = spans[i].trim().split(":");
-                rowAndCol = indexAndSpan[1].split("x");
-                spanMatrix[i][0] = Integer.parseInt(indexAndSpan[0]);
-                spanMatrix[i][1] = Integer.parseInt(rowAndCol[0]);
-                spanMatrix[i][2] = Integer.parseInt(rowAndCol[1]);
+            if (mRows == 1 || mColumns == 1) {
+                for (int i = 0; i < spans.length; i++) {
+                    indexAndSpan = spans[i].trim().split(":");
+                    spanMatrix[i][0] = Integer.parseInt(indexAndSpan[0]);
+                    spanMatrix[i][1] = 1;
+                    spanMatrix[i][2] = 1;
+
+                    if (mColumns == 1) {
+                        spanMatrix[i][1] = Integer.parseInt(indexAndSpan[1]);
+                        extraRows += spanMatrix[i][1];
+                        if (isSpans) {
+                            extraRows--;
+                        }
+                    }
+                    if (mRows == 1) {
+                        spanMatrix[i][2] = Integer.parseInt(indexAndSpan[1]);
+                        extraColumns += spanMatrix[i][2];
+                        if (isSpans) {
+                            extraColumns--;
+                        }
+                    }
+                }
+
+                if (extraRows != 0 && !mExtraSpaceHandled) {
+                    this.setRows(mRows + extraRows);
+                }
+                if (extraColumns != 0 && !mExtraSpaceHandled) {
+                    this.setColumns(mColumns + extraColumns);
+                }
+                mExtraSpaceHandled = true;
+            } else {
+                String[] rowAndCol;
+                for (int i = 0; i < spans.length; i++) {
+                    indexAndSpan = spans[i].trim().split(":");
+                    rowAndCol = indexAndSpan[1].split("x");
+                    spanMatrix[i][0] = Integer.parseInt(indexAndSpan[0]);
+                    spanMatrix[i][1] = Integer.parseInt(rowAndCol[0]);
+                    spanMatrix[i][2] = Integer.parseInt(rowAndCol[1]);
+                }
             }
             return spanMatrix;
         } catch (Exception e) {
@@ -834,14 +878,14 @@
         mNextAvailableIndex = 0;
 
         if (mSkips != null && !mSkips.trim().isEmpty()) {
-            int[][] mSkips = parseSpans(this.mSkips);
+            int[][] mSkips = parseSpans(this.mSkips, false);
             if (mSkips != null) {
                 handleSkips(mSkips);
             }
         }
 
         if (mSpans != null && !mSpans.trim().isEmpty()) {
-            int[][] mSpans = parseSpans(this.mSpans);
+            int[][] mSpans = parseSpans(this.mSpans, true);
             if (mSpans != null) {
                 handleSpans(mSpans);
             }
diff --git a/constraintlayout/constraintlayout/build.gradle b/constraintlayout/constraintlayout/build.gradle
index 2b9c625..894dfc7 100644
--- a/constraintlayout/constraintlayout/build.gradle
+++ b/constraintlayout/constraintlayout/build.gradle
@@ -26,6 +26,7 @@
     implementation("androidx.appcompat:appcompat:1.2.0")
     implementation("androidx.core:core:1.3.2")
     implementation(project(":constraintlayout:constraintlayout-core"))
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
 
     testImplementation(libs.junit)
 
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-ktx/api/1.10.0-beta01.txt b/core/core-ktx/api/1.10.0-beta01.txt
new file mode 100644
index 0000000..801b56b
--- /dev/null
+++ b/core/core-ktx/api/1.10.0-beta01.txt
@@ -0,0 +1,634 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point div(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF div(android.graphics.PointF, float scalar);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point times(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF times(android.graphics.PointF, float scalar);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static android.graphics.Bitmap? toBitmapOrNull(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method public static android.os.Bundle bundleOf();
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  @RequiresApi(31) public final class OutcomeReceiverKt {
+    method @RequiresApi(31) public static <R, E extends java.lang.Throwable> android.os.OutcomeReceiver<R,E> asOutcomeReceiver(kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf();
+    method @RequiresApi(21) public static android.os.PersistableBundle toPersistableBundle(java.util.Map<java.lang.String,?>);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AndroidXConsumerKt {
+    method public static <T> androidx.core.util.Consumer<T> asAndroidXConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  @RequiresApi(24) public final class ConsumerKt {
+    method @RequiresApi(24) public static <T> java.util.function.Consumer<T> asConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class RunnableKt {
+    method public static Runnable asRunnable(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method public static inline operator float component1(androidx.core.util.SizeFCompat);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+    method public static inline operator float component2(androidx.core.util.SizeFCompat);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+    method public static inline void removeItemAt(android.view.Menu, int index);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline kotlin.ranges.IntRange getIndices(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean);
+    method public static inline void setInvisible(android.view.View, boolean);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_1.10.0-beta01.txt b/core/core-ktx/api/public_plus_experimental_1.10.0-beta01.txt
new file mode 100644
index 0000000..801b56b
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.10.0-beta01.txt
@@ -0,0 +1,634 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point div(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF div(android.graphics.PointF, float scalar);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point times(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF times(android.graphics.PointF, float scalar);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static android.graphics.Bitmap? toBitmapOrNull(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method public static android.os.Bundle bundleOf();
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  @RequiresApi(31) public final class OutcomeReceiverKt {
+    method @RequiresApi(31) public static <R, E extends java.lang.Throwable> android.os.OutcomeReceiver<R,E> asOutcomeReceiver(kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf();
+    method @RequiresApi(21) public static android.os.PersistableBundle toPersistableBundle(java.util.Map<java.lang.String,?>);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AndroidXConsumerKt {
+    method public static <T> androidx.core.util.Consumer<T> asAndroidXConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  @RequiresApi(24) public final class ConsumerKt {
+    method @RequiresApi(24) public static <T> java.util.function.Consumer<T> asConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class RunnableKt {
+    method public static Runnable asRunnable(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method public static inline operator float component1(androidx.core.util.SizeFCompat);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+    method public static inline operator float component2(androidx.core.util.SizeFCompat);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+    method public static inline void removeItemAt(android.view.Menu, int index);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline kotlin.ranges.IntRange getIndices(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean);
+    method public static inline void setInvisible(android.view.View, boolean);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/res-1.10.0-beta01.txt b/core/core-ktx/api/res-1.10.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/core/core-ktx/api/res-1.10.0-beta01.txt
diff --git a/core/core-ktx/api/restricted_1.10.0-beta01.txt b/core/core-ktx/api/restricted_1.10.0-beta01.txt
new file mode 100644
index 0000000..801b56b
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.10.0-beta01.txt
@@ -0,0 +1,634 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point div(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF div(android.graphics.PointF, float scalar);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point times(android.graphics.Point, float scalar);
+    method public static inline operator android.graphics.PointF times(android.graphics.PointF, float scalar);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static android.graphics.Bitmap? toBitmapOrNull(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method public static android.os.Bundle bundleOf();
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  @RequiresApi(31) public final class OutcomeReceiverKt {
+    method @RequiresApi(31) public static <R, E extends java.lang.Throwable> android.os.OutcomeReceiver<R,E> asOutcomeReceiver(kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf();
+    method @RequiresApi(21) public static android.os.PersistableBundle toPersistableBundle(java.util.Map<java.lang.String,?>);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![] getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AndroidXConsumerKt {
+    method public static <T> androidx.core.util.Consumer<T> asAndroidXConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  @RequiresApi(24) public final class ConsumerKt {
+    method @RequiresApi(24) public static <T> java.util.function.Consumer<T> asConsumer(kotlin.coroutines.Continuation<? super T>);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class RunnableKt {
+    method public static Runnable asRunnable(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method public static inline operator float component1(androidx.core.util.SizeFCompat);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+    method public static inline operator float component2(androidx.core.util.SizeFCompat);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+    method public static inline void removeItemAt(android.view.Menu, int index);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline kotlin.ranges.IntRange getIndices(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean);
+    method public static inline void setInvisible(android.view.View, boolean);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-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/1.10.0-beta01.txt b/core/core/api/1.10.0-beta01.txt
new file mode 100644
index 0000000..5033a53
--- /dev/null
+++ b/core/core/api/1.10.0-beta01.txt
@@ -0,0 +1,3929 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class LocaleManagerCompat {
+    method @AnyThread public static androidx.core.os.LocaleListCompat getSystemLocales(android.content.Context);
+  }
+
+  public final class MultiWindowModeChangedInfo {
+    ctor public MultiWindowModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public MultiWindowModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInMultiWindowMode();
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_ANSWER_COLOR = "android.answerColor";
+    field public static final String EXTRA_ANSWER_INTENT = "android.answerIntent";
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CALL_IS_VIDEO = "android.callIsVideo";
+    field public static final String EXTRA_CALL_PERSON = "android.callPerson";
+    field public static final String EXTRA_CALL_PERSON_COMPAT = "android.callPersonCompat";
+    field public static final String EXTRA_CALL_TYPE = "android.callType";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_DECLINE_COLOR = "android.declineColor";
+    field public static final String EXTRA_DECLINE_INTENT = "android.declineIntent";
+    field public static final String EXTRA_HANG_UP_INTENT = "android.hangUpIntent";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription";
+    field public static final String EXTRA_PICTURE_ICON = "android.pictureIcon";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final String EXTRA_VERIFICATION_ICON = "android.verificationIcon";
+    field public static final String EXTRA_VERIFICATION_ICON_COMPAT = "android.verificationIconCompat";
+    field public static final String EXTRA_VERIFICATION_TEXT = "android.verificationText";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent? actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setAuthenticationRequired(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method @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?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle setContentDescription(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static class NotificationCompat.CallStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.CallStyle();
+    ctor public NotificationCompat.CallStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public static androidx.core.app.NotificationCompat.CallStyle forIncomingCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forOngoingCall(androidx.core.app.Person, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forScreeningCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.CallStyle setAnswerButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setDeclineButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setIsVideo(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.drawable.Icon?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationText(CharSequence?);
+    field public static final int CALL_TYPE_INCOMING = 1; // 0x1
+    field public static final int CALL_TYPE_ONGOING = 2; // 0x2
+    field public static final int CALL_TYPE_SCREENING = 3; // 0x3
+    field public static final int CALL_TYPE_UNKNOWN = 0; // 0x0
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(int, android.app.Notification);
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public interface OnMultiWindowModeChangedProvider {
+    method public void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+  }
+
+  public interface OnNewIntentProvider {
+    method public void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+  }
+
+  public interface OnPictureInPictureModeChangedProvider {
+    method public void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+  }
+
+  public final class PendingIntentCompat {
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int, boolean);
+    method @RequiresApi(26) public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int, boolean);
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class PictureInPictureModeChangedInfo {
+    ctor public PictureInPictureModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public PictureInPictureModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInPictureInPictureMode();
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String!,android.net.Uri!>);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>? getAllowedDataTypes();
+    method public CharSequence![]? getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>? getDataResultsFromIntent(android.content.Intent, String);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle getExtras();
+    method public CharSequence? getLabel();
+    method public String getResultKey();
+    method public static android.os.Bundle? getResultsFromIntent(android.content.Intent);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor? query(android.content.ContentResolver, android.net.Uri, String![]?, String?, String![]?, String?, androidx.core.os.CancellationSignal?);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, int);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, String?, android.os.Handler?, int);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+    field public static final int RECEIVER_EXPORTED = 2; // 0x2
+    field public static final int RECEIVER_NOT_EXPORTED = 4; // 0x4
+    field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    ctor protected FileProvider(@XmlRes int);
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String? getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.os.Parcelable![]? getParcelableArrayExtra(android.content.Intent, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayListExtra(android.content.Intent, String?, Class<? extends T>);
+    method public static <T> T? getParcelableExtra(android.content.Intent, String?, Class<T!>);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public class IntentSanitizer {
+    method public android.content.Intent sanitize(android.content.Intent, androidx.core.util.Consumer<java.lang.String!>);
+    method public android.content.Intent sanitizeByFiltering(android.content.Intent);
+    method public android.content.Intent sanitizeByThrowing(android.content.Intent);
+  }
+
+  public static final class IntentSanitizer.Builder {
+    ctor public IntentSanitizer.Builder();
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowAnyComponent();
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipData(androidx.core.util.Predicate<android.content.ClipData!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataText();
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUri(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(android.content.ComponentName);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(androidx.core.util.Predicate<android.content.ComponentName!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponentWithPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowData(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowDataWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<?>);
+    method public <T> androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<T!>, androidx.core.util.Predicate<T!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, androidx.core.util.Predicate<java.lang.Object!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStream(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStreamUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowFlags(int);
+    method public androidx.core.content.IntentSanitizer.Builder allowHistoryStackFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowIdentifier();
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowReceiverFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowSelector();
+    method public androidx.core.content.IntentSanitizer.Builder allowSourceBounds();
+    method public androidx.core.content.IntentSanitizer.Builder allowType(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowType(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer build();
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public interface OnConfigurationChangedProvider {
+    method public void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+  }
+
+  public interface OnTrimMemoryProvider {
+    method public void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+  public class UriMatcherCompat {
+    method public static androidx.core.util.Predicate<android.net.Uri!> asPredicate(android.content.UriMatcher);
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public int getExcludedFromSurfaces();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isExcludedFromSurfaces(int);
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+    field public static final int SURFACE_LAUNCHER = 1; // 0x1
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExcludedFromSurfaces(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static void clearCachesForTheme(android.content.res.Resources.Theme);
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, android.graphics.Rect?, boolean);
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, @IntRange(from=1, to=1000) int, boolean);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode?);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
+    method @DrawableRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method @FloatRange(from=0.0) public static float getMslAltitudeAccuracyMeters(android.location.Location);
+    method public static double getMslAltitudeMeters(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasMslAltitude(android.location.Location);
+    method public static boolean hasMslAltitudeAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void removeMslAltitude(android.location.Location);
+    method public static void removeMslAltitudeAccuracy(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setMslAltitudeAccuracyMeters(android.location.Location, @FloatRange(from=0.0) float);
+    method public static void setMslAltitudeMeters(android.location.Location, double);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_MSL_ALTITUDE = "androidx.core.location.extra.MSL_ALTITUDE";
+    field public static final String EXTRA_MSL_ALTITUDE_ACCURACY = "androidx.core.location.extra.MSL_ALTITUDE_ACCURACY";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback, android.os.Handler);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static void unregisterGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @Deprecated @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+    field @ChecksSdkIntAtLeast(extension=android.os.ext.SdkExtensions.AD_SERVICES) public static final int AD_SERVICES_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.R) public static final int R_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.S) public static final int S_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.TIRAMISU) public static final int T_EXTENSION_INT;
+  }
+
+  public final class BundleCompat {
+    method public static <T> T? getParcelable(android.os.Bundle, String?, Class<T!>);
+    method public static android.os.Parcelable![]? getParcelableArray(android.os.Bundle, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayList(android.os.Bundle, String?, Class<? extends T>);
+    method public static <T> android.util.SparseArray<T!>? getSparseParcelableArray(android.os.Bundle, String?, Class<? extends T>);
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale? get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale?);
+    method public boolean isEmpty();
+    method @RequiresApi(21) public static boolean matchesLanguageAndScript(java.util.Locale, java.util.Locale);
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static <T> Object![]? readArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> java.util.ArrayList<T!>? readArrayList(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static <K, V> java.util.HashMap<K!,V!>? readHashMap(android.os.Parcel, ClassLoader?, Class<? extends K>, Class<? extends V>);
+    method public static <T> void readList(android.os.Parcel, java.util.List<? super T>, ClassLoader?, Class<T!>);
+    method public static <K, V> void readMap(android.os.Parcel, java.util.Map<? super K,? super V>, ClassLoader?, Class<K!>, Class<V!>);
+    method public static <T extends android.os.Parcelable> T? readParcelable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @Deprecated public static <T> T![]? readParcelableArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.os.Parcelable![]? readParcelableArrayTyped(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(30) public static <T> android.os.Parcelable.Creator<T!>? readParcelableCreator(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public static <T> java.util.List<T!> readParcelableList(android.os.Parcel, java.util.List<T!>, ClassLoader?, Class<T!>);
+    method public static <T extends java.io.Serializable> T? readSerializable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.util.SparseArray<T!>? readSparseArray(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public default androidx.core.util.Predicate<T!>! and(androidx.core.util.Predicate<? super T>!);
+    method public static <T> androidx.core.util.Predicate<T!>! isEqual(Object!);
+    method public default androidx.core.util.Predicate<T!>! negate();
+    method public static <T> androidx.core.util.Predicate<T!>! not(androidx.core.util.Predicate<? super T>!);
+    method public default androidx.core.util.Predicate<T!>! or(androidx.core.util.Predicate<? super T>!);
+    method public boolean test(T!);
+  }
+
+  public final class SizeFCompat {
+    ctor public SizeFCompat(float, float);
+    method public float getHeight();
+    method public float getWidth();
+    method @RequiresApi(21) public android.util.SizeF toSizeF();
+    method @RequiresApi(21) public static androidx.core.util.SizeFCompat toSizeFCompat(android.util.SizeF);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener?);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect?, java.util.List<android.graphics.Rect!>?);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, androidx.core.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View, androidx.core.view.DragStartHelper);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler?);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener?);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void onPrepareMenu(android.view.Menu);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider? getActionProvider(android.view.MenuItem);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static CharSequence? getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList? getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode? getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static CharSequence? getTooltipText(android.view.MenuItem);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem? setActionProvider(android.view.MenuItem, androidx.core.view.ActionProvider?);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, CharSequence?);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList?);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode?);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem, CharSequence?);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public default void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public default void onPrepareMenu(android.view.Menu);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View);
+    method public void onViewDetachedFromWindow(android.view.View);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static androidx.core.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static androidx.core.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method @Deprecated public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setListener(androidx.core.view.ViewPropertyAnimatorListener?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener?);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withEndAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat withStartAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @Deprecated @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_DEFAULT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 256; // 0x100
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method @Deprecated public int getActions();
+    method public java.util.List<java.lang.String!> getAvailableExtraData();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMinMillisBetweenContentChanges();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String? getUniqueId();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean hasRequestInitialAccessibilityFocus();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isTextSelectable();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method @Deprecated public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMinMillisBetweenContentChanges(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRequestInitialAccessibilityFocus(boolean);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelectable(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setUniqueId(String?);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final int EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH = 20000; // 0x4e20
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_CANCEL;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_DROP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_START;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_TEXT_SUGGESTIONS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object?);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object? getProvider();
+    method public boolean performAction(int, int, android.os.Bundle?);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View?, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String? getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence? getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getChild(int);
+    method public int getChildCount();
+    method public int getDisplayId();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getParent();
+    method public void getRegionInScreen(android.graphics.Region);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getRoot();
+    method public CharSequence? getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public boolean isInPictureInPictureMode();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat?);
+    method @Deprecated public void recycle();
+    method public android.view.accessibility.AccessibilityWindowInfo? unwrap();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/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_1.10.0-beta01.txt b/core/core/api/public_plus_experimental_1.10.0-beta01.txt
new file mode 100644
index 0000000..2b431b6
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.10.0-beta01.txt
@@ -0,0 +1,3935 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class LocaleManagerCompat {
+    method @AnyThread public static androidx.core.os.LocaleListCompat getSystemLocales(android.content.Context);
+  }
+
+  public final class MultiWindowModeChangedInfo {
+    ctor public MultiWindowModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public MultiWindowModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInMultiWindowMode();
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_ANSWER_COLOR = "android.answerColor";
+    field public static final String EXTRA_ANSWER_INTENT = "android.answerIntent";
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CALL_IS_VIDEO = "android.callIsVideo";
+    field public static final String EXTRA_CALL_PERSON = "android.callPerson";
+    field public static final String EXTRA_CALL_PERSON_COMPAT = "android.callPersonCompat";
+    field public static final String EXTRA_CALL_TYPE = "android.callType";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_DECLINE_COLOR = "android.declineColor";
+    field public static final String EXTRA_DECLINE_INTENT = "android.declineIntent";
+    field public static final String EXTRA_HANG_UP_INTENT = "android.hangUpIntent";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription";
+    field public static final String EXTRA_PICTURE_ICON = "android.pictureIcon";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final String EXTRA_VERIFICATION_ICON = "android.verificationIcon";
+    field public static final String EXTRA_VERIFICATION_ICON_COMPAT = "android.verificationIconCompat";
+    field public static final String EXTRA_VERIFICATION_TEXT = "android.verificationText";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent? actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setAuthenticationRequired(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method @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?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle setContentDescription(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static class NotificationCompat.CallStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.CallStyle();
+    ctor public NotificationCompat.CallStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public static androidx.core.app.NotificationCompat.CallStyle forIncomingCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forOngoingCall(androidx.core.app.Person, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forScreeningCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.CallStyle setAnswerButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setDeclineButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setIsVideo(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.drawable.Icon?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationText(CharSequence?);
+    field public static final int CALL_TYPE_INCOMING = 1; // 0x1
+    field public static final int CALL_TYPE_ONGOING = 2; // 0x2
+    field public static final int CALL_TYPE_SCREENING = 3; // 0x3
+    field public static final int CALL_TYPE_UNKNOWN = 0; // 0x0
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(int, android.app.Notification);
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public interface OnMultiWindowModeChangedProvider {
+    method public void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+  }
+
+  public interface OnNewIntentProvider {
+    method public void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+  }
+
+  public interface OnPictureInPictureModeChangedProvider {
+    method public void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+  }
+
+  public final class PendingIntentCompat {
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int, boolean);
+    method @RequiresApi(26) public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int, boolean);
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class PictureInPictureModeChangedInfo {
+    ctor public PictureInPictureModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public PictureInPictureModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInPictureInPictureMode();
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String!,android.net.Uri!>);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>? getAllowedDataTypes();
+    method public CharSequence![]? getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>? getDataResultsFromIntent(android.content.Intent, String);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle getExtras();
+    method public CharSequence? getLabel();
+    method public String getResultKey();
+    method public static android.os.Bundle? getResultsFromIntent(android.content.Intent);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor? query(android.content.ContentResolver, android.net.Uri, String![]?, String?, String![]?, String?, androidx.core.os.CancellationSignal?);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, int);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, String?, android.os.Handler?, int);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+    field public static final int RECEIVER_EXPORTED = 2; // 0x2
+    field public static final int RECEIVER_NOT_EXPORTED = 4; // 0x4
+    field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    ctor protected FileProvider(@XmlRes int);
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String? getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.os.Parcelable![]? getParcelableArrayExtra(android.content.Intent, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayListExtra(android.content.Intent, String?, Class<? extends T>);
+    method public static <T> T? getParcelableExtra(android.content.Intent, String?, Class<T!>);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public class IntentSanitizer {
+    method public android.content.Intent sanitize(android.content.Intent, androidx.core.util.Consumer<java.lang.String!>);
+    method public android.content.Intent sanitizeByFiltering(android.content.Intent);
+    method public android.content.Intent sanitizeByThrowing(android.content.Intent);
+  }
+
+  public static final class IntentSanitizer.Builder {
+    ctor public IntentSanitizer.Builder();
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowAnyComponent();
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipData(androidx.core.util.Predicate<android.content.ClipData!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataText();
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUri(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(android.content.ComponentName);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(androidx.core.util.Predicate<android.content.ComponentName!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponentWithPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowData(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowDataWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<?>);
+    method public <T> androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<T!>, androidx.core.util.Predicate<T!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, androidx.core.util.Predicate<java.lang.Object!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStream(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStreamUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowFlags(int);
+    method public androidx.core.content.IntentSanitizer.Builder allowHistoryStackFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowIdentifier();
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowReceiverFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowSelector();
+    method public androidx.core.content.IntentSanitizer.Builder allowSourceBounds();
+    method public androidx.core.content.IntentSanitizer.Builder allowType(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowType(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer build();
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public interface OnConfigurationChangedProvider {
+    method public void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+  }
+
+  public interface OnTrimMemoryProvider {
+    method public void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+  public class UriMatcherCompat {
+    method public static androidx.core.util.Predicate<android.net.Uri!> asPredicate(android.content.UriMatcher);
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public int getExcludedFromSurfaces();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isExcludedFromSurfaces(int);
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+    field public static final int SURFACE_LAUNCHER = 1; // 0x1
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExcludedFromSurfaces(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static void clearCachesForTheme(android.content.res.Resources.Theme);
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, android.graphics.Rect?, boolean);
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, @IntRange(from=1, to=1000) int, boolean);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode?);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
+    method @DrawableRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method @FloatRange(from=0.0) public static float getMslAltitudeAccuracyMeters(android.location.Location);
+    method public static double getMslAltitudeMeters(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasMslAltitude(android.location.Location);
+    method public static boolean hasMslAltitudeAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void removeMslAltitude(android.location.Location);
+    method public static void removeMslAltitudeAccuracy(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setMslAltitudeAccuracyMeters(android.location.Location, @FloatRange(from=0.0) float);
+    method public static void setMslAltitudeMeters(android.location.Location, double);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_MSL_ALTITUDE = "androidx.core.location.extra.MSL_ALTITUDE";
+    field public static final String EXTRA_MSL_ALTITUDE_ACCURACY = "androidx.core.location.extra.MSL_ALTITUDE_ACCURACY";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback, android.os.Handler);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static void unregisterGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @Deprecated @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+    method @Deprecated @ChecksSdkIntAtLeast(api=32, codename="Sv2") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastSv2();
+    method @ChecksSdkIntAtLeast(api=33, codename="Tiramisu") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastT();
+    method @ChecksSdkIntAtLeast(codename="UpsideDownCake") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastU();
+    field @ChecksSdkIntAtLeast(extension=android.os.ext.SdkExtensions.AD_SERVICES) public static final int AD_SERVICES_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.R) public static final int R_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.S) public static final int S_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.TIRAMISU) public static final int T_EXTENSION_INT;
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface BuildCompat.PrereleaseSdkCheck {
+  }
+
+  public final class BundleCompat {
+    method public static <T> T? getParcelable(android.os.Bundle, String?, Class<T!>);
+    method public static android.os.Parcelable![]? getParcelableArray(android.os.Bundle, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayList(android.os.Bundle, String?, Class<? extends T>);
+    method public static <T> android.util.SparseArray<T!>? getSparseParcelableArray(android.os.Bundle, String?, Class<? extends T>);
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale? get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale?);
+    method public boolean isEmpty();
+    method @RequiresApi(21) public static boolean matchesLanguageAndScript(java.util.Locale, java.util.Locale);
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static <T> Object![]? readArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> java.util.ArrayList<T!>? readArrayList(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static <K, V> java.util.HashMap<K!,V!>? readHashMap(android.os.Parcel, ClassLoader?, Class<? extends K>, Class<? extends V>);
+    method public static <T> void readList(android.os.Parcel, java.util.List<? super T>, ClassLoader?, Class<T!>);
+    method public static <K, V> void readMap(android.os.Parcel, java.util.Map<? super K,? super V>, ClassLoader?, Class<K!>, Class<V!>);
+    method public static <T extends android.os.Parcelable> T? readParcelable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @Deprecated public static <T> T![]? readParcelableArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.os.Parcelable![]? readParcelableArrayTyped(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(30) public static <T> android.os.Parcelable.Creator<T!>? readParcelableCreator(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public static <T> java.util.List<T!> readParcelableList(android.os.Parcel, java.util.List<T!>, ClassLoader?, Class<T!>);
+    method public static <T extends java.io.Serializable> T? readSerializable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.util.SparseArray<T!>? readSparseArray(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public default androidx.core.util.Predicate<T!>! and(androidx.core.util.Predicate<? super T>!);
+    method public static <T> androidx.core.util.Predicate<T!>! isEqual(Object!);
+    method public default androidx.core.util.Predicate<T!>! negate();
+    method public static <T> androidx.core.util.Predicate<T!>! not(androidx.core.util.Predicate<? super T>!);
+    method public default androidx.core.util.Predicate<T!>! or(androidx.core.util.Predicate<? super T>!);
+    method public boolean test(T!);
+  }
+
+  public final class SizeFCompat {
+    ctor public SizeFCompat(float, float);
+    method public float getHeight();
+    method public float getWidth();
+    method @RequiresApi(21) public android.util.SizeF toSizeF();
+    method @RequiresApi(21) public static androidx.core.util.SizeFCompat toSizeFCompat(android.util.SizeF);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener?);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect?, java.util.List<android.graphics.Rect!>?);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, androidx.core.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View, androidx.core.view.DragStartHelper);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler?);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener?);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void onPrepareMenu(android.view.Menu);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider? getActionProvider(android.view.MenuItem);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static CharSequence? getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList? getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode? getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static CharSequence? getTooltipText(android.view.MenuItem);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem? setActionProvider(android.view.MenuItem, androidx.core.view.ActionProvider?);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, CharSequence?);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList?);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode?);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem, CharSequence?);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public default void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public default void onPrepareMenu(android.view.Menu);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View);
+    method public void onViewDetachedFromWindow(android.view.View);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static androidx.core.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static androidx.core.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method @Deprecated public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setListener(androidx.core.view.ViewPropertyAnimatorListener?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener?);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withEndAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat withStartAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @Deprecated @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_DEFAULT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 256; // 0x100
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method @Deprecated public int getActions();
+    method public java.util.List<java.lang.String!> getAvailableExtraData();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMinMillisBetweenContentChanges();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String? getUniqueId();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean hasRequestInitialAccessibilityFocus();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isTextSelectable();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method @Deprecated public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMinMillisBetweenContentChanges(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRequestInitialAccessibilityFocus(boolean);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelectable(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setUniqueId(String?);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final int EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH = 20000; // 0x4e20
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_CANCEL;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_DROP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_START;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_TEXT_SUGGESTIONS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object?);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object? getProvider();
+    method public boolean performAction(int, int, android.os.Bundle?);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View?, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String? getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence? getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getChild(int);
+    method public int getChildCount();
+    method public int getDisplayId();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getParent();
+    method public void getRegionInScreen(android.graphics.Region);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getRoot();
+    method public CharSequence? getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public boolean isInPictureInPictureMode();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat?);
+    method @Deprecated public void recycle();
+    method public android.view.accessibility.AccessibilityWindowInfo? unwrap();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_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/res-1.10.0-beta01.txt b/core/core/api/res-1.10.0-beta01.txt
new file mode 100644
index 0000000..dd913d3
--- /dev/null
+++ b/core/core/api/res-1.10.0-beta01.txt
@@ -0,0 +1,21 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr lStar
+attr queryPatterns
+attr shortcutMatchRequired
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/restricted_1.10.0-beta01.txt b/core/core/api/restricted_1.10.0-beta01.txt
new file mode 100644
index 0000000..9556806
--- /dev/null
+++ b/core/core/api/restricted_1.10.0-beta01.txt
@@ -0,0 +1,4438 @@
+// Signature format: 4.0
+package android.support.v4.os {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+    ctor public ResultReceiver(android.os.Handler!);
+    method public int describeContents();
+    method protected void onReceiveResult(int, android.os.Bundle!);
+    method public void send(int, android.os.Bundle!);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+  }
+
+}
+
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate? getPermissionCompatDelegate();
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+    method public void validateRequestPermissionsRequestCode(int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+    ctor public ComponentActivity();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+    method protected final boolean shouldDumpInternalState(String![]?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+    ctor @Deprecated public ComponentActivity.ExtraData();
+  }
+
+  @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+    ctor public CoreComponentFactory();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+    method public Object! getWrapper();
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class LocaleManagerCompat {
+    method @AnyThread public static androidx.core.os.LocaleListCompat getSystemLocales(android.content.Context);
+  }
+
+  public final class MultiWindowModeChangedInfo {
+    ctor public MultiWindowModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public MultiWindowModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInMultiWindowMode();
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+    method public android.app.Notification.Builder! getBuilder();
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_ANSWER_COLOR = "android.answerColor";
+    field public static final String EXTRA_ANSWER_INTENT = "android.answerIntent";
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CALL_IS_VIDEO = "android.callIsVideo";
+    field public static final String EXTRA_CALL_PERSON = "android.callPerson";
+    field public static final String EXTRA_CALL_PERSON_COMPAT = "android.callPersonCompat";
+    field public static final String EXTRA_CALL_TYPE = "android.callType";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_DECLINE_COLOR = "android.declineColor";
+    field public static final String EXTRA_DECLINE_INTENT = "android.declineIntent";
+    field public static final String EXTRA_HANG_UP_INTENT = "android.hangUpIntent";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription";
+    field public static final String EXTRA_PICTURE_ICON = "android.pictureIcon";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final String EXTRA_VERIFICATION_ICON = "android.verificationIcon";
+    field public static final String EXTRA_VERIFICATION_ICON_COMPAT = "android.verificationIconCompat";
+    field public static final String EXTRA_VERIFICATION_TEXT = "android.verificationText";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int MAX_ACTION_BUTTONS = 3; // 0x3
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent? actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Action.Builder fromAndroidAction(android.app.Notification.Action);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setAuthenticationRequired(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method @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?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle setContentDescription(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFlags(int);
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+    method @ColorInt @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+    method public android.os.Bundle getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getForegroundServiceBehavior();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+    method @Deprecated public android.app.Notification getNotification();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(@androidx.core.app.NotificationCompat.ServiceNotificationBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, @androidx.core.app.NotificationCompat.StreamType int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.Person!> mPersonList;
+  }
+
+  public static class NotificationCompat.CallStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.CallStyle();
+    ctor public NotificationCompat.CallStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public static androidx.core.app.NotificationCompat.CallStyle forIncomingCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forOngoingCall(androidx.core.app.Person, android.app.PendingIntent);
+    method public static androidx.core.app.NotificationCompat.CallStyle forScreeningCall(androidx.core.app.Person, android.app.PendingIntent, android.app.PendingIntent);
+    method @RequiresApi(20) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!> getActionsListWithSystemActions();
+    method public androidx.core.app.NotificationCompat.CallStyle setAnswerButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setDeclineButtonColorHint(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CallStyle setIsVideo(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.drawable.Icon?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.CallStyle setVerificationText(CharSequence?);
+    field public static final int CALL_TYPE_INCOMING = 1; // 0x1
+    field public static final int CALL_TYPE_ONGOING = 2; // 0x2
+    field public static final int CALL_TYPE_SCREENING = 3; // 0x3
+    field public static final int CALL_TYPE_UNKNOWN = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.CallStyle.CALL_TYPE_UNKNOWN, androidx.core.app.NotificationCompat.CallStyle.CALL_TYPE_INCOMING, androidx.core.app.NotificationCompat.CallStyle.CALL_TYPE_ONGOING, androidx.core.app.NotificationCompat.CallStyle.CALL_TYPE_SCREENING}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.CallStyle.CallType {
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFAULT, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFERRED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.ServiceNotificationBehavior {
+  }
+
+  @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews applyStandardTemplate(boolean, int, boolean);
+    method public android.app.Notification? build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void clearCompatExtraKeys(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean displayCustomViewInline();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Style? extractStyleFromNotification(android.app.Notification);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected String? getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle);
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(int, android.app.Notification);
+    method @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS) public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public interface OnMultiWindowModeChangedProvider {
+    method public void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+  }
+
+  public interface OnNewIntentProvider {
+    method public void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+  }
+
+  public interface OnPictureInPictureModeChangedProvider {
+    method public void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+  }
+
+  public final class PendingIntentCompat {
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent![], int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle, boolean);
+    method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int, boolean);
+    method @RequiresApi(26) public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int, boolean);
+    method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int, boolean);
+  }
+
+  public class Person {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String resolveToLegacyUri();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class PictureInPictureModeChangedInfo {
+    ctor public PictureInPictureModeChangedInfo(boolean);
+    ctor @RequiresApi(26) public PictureInPictureModeChangedInfo(boolean, android.content.res.Configuration);
+    method @RequiresApi(26) public android.content.res.Configuration getNewConfig();
+    method public boolean isInPictureInPictureMode();
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(4) public android.app.PendingIntent mActionIntent;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(3) public CharSequence mContentDescription;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(5) public boolean mEnabled;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(1) public androidx.core.graphics.drawable.IconCompat mIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(6) public boolean mShouldShowIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(2) public CharSequence mTitle;
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String!,android.net.Uri!>);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>? getAllowedDataTypes();
+    method public CharSequence![]? getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>? getDataResultsFromIntent(android.content.Intent, String);
+    method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+    method public android.os.Bundle getExtras();
+    method public CharSequence? getLabel();
+    method public String getResultKey();
+    method public static android.os.Bundle? getResultsFromIntent(android.content.Intent);
+    method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor? query(android.content.ContentResolver, android.net.Uri, String![]?, String?, String![]?, String?, androidx.core.os.CancellationSignal?);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, int);
+    method public static android.content.Intent? registerReceiver(android.content.Context, android.content.BroadcastReceiver?, android.content.IntentFilter, String?, android.os.Handler?, int);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+    field public static final int RECEIVER_EXPORTED = 2; // 0x2
+    field public static final int RECEIVER_NOT_EXPORTED = 4; // 0x4
+    field public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 1; // 0x1
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    ctor protected FileProvider(@XmlRes int);
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String? getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.os.Parcelable![]? getParcelableArrayExtra(android.content.Intent, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayListExtra(android.content.Intent, String?, Class<? extends T>);
+    method public static <T> T? getParcelableExtra(android.content.Intent, String?, Class<T!>);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public class IntentSanitizer {
+    method public android.content.Intent sanitize(android.content.Intent, androidx.core.util.Consumer<java.lang.String!>);
+    method public android.content.Intent sanitizeByFiltering(android.content.Intent);
+    method public android.content.Intent sanitizeByThrowing(android.content.Intent);
+  }
+
+  public static final class IntentSanitizer.Builder {
+    ctor public IntentSanitizer.Builder();
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowAction(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowAnyComponent();
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowCategory(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipData(androidx.core.util.Predicate<android.content.ClipData!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataText();
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUri(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowClipDataUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(android.content.ComponentName);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponent(androidx.core.util.Predicate<android.content.ComponentName!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowComponentWithPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowData(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowDataWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<?>);
+    method public <T> androidx.core.content.IntentSanitizer.Builder allowExtra(String, Class<T!>, androidx.core.util.Predicate<T!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtra(String, androidx.core.util.Predicate<java.lang.Object!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraOutput(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStream(androidx.core.util.Predicate<android.net.Uri!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowExtraStreamUriWithAuthority(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowFlags(int);
+    method public androidx.core.content.IntentSanitizer.Builder allowHistoryStackFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowIdentifier();
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowPackage(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer.Builder allowReceiverFlags();
+    method public androidx.core.content.IntentSanitizer.Builder allowSelector();
+    method public androidx.core.content.IntentSanitizer.Builder allowSourceBounds();
+    method public androidx.core.content.IntentSanitizer.Builder allowType(String);
+    method public androidx.core.content.IntentSanitizer.Builder allowType(androidx.core.util.Predicate<java.lang.String!>);
+    method public androidx.core.content.IntentSanitizer build();
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public interface OnConfigurationChangedProvider {
+    method public void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+  }
+
+  public interface OnTrimMemoryProvider {
+    method public void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+  public class UriMatcherCompat {
+    method public static androidx.core.util.Predicate<android.net.Uri!> asPredicate(android.content.UriMatcher);
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoChangeListener {
+    ctor public ShortcutInfoChangeListener();
+    method @AnyThread public void onAllShortcutsRemoved();
+    method @AnyThread public void onShortcutAdded(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutRemoved(java.util.List<java.lang.String!>);
+    method @AnyThread public void onShortcutUpdated(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutUsageReported(java.util.List<java.lang.String!>);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method @androidx.core.content.pm.ShortcutInfoCompat.Surface public int getExcludedFromSurfaces();
+    method public android.os.PersistableBundle? getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.Bundle? getTransientExtras();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isExcludedFromSurfaces(@androidx.core.content.pm.ShortcutInfoCompat.Surface int);
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+    field public static final int SURFACE_LAUNCHER = 1; // 0x1
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+    ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExcludedFromSurfaces(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.content.pm.ShortcutInfoCompat.Builder setTransientExtras(android.os.Bundle);
+  }
+
+  @IntDef(flag=true, value={androidx.core.content.pm.ShortcutInfoCompat.SURFACE_LAUNCHER}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutInfoCompat.Surface {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+    ctor public ShortcutInfoCompatSaver();
+    method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+    method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+    method @AnyThread public abstract T! removeAllShortcuts();
+    method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, @androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+  @IntDef(flag=true, value={androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_MANIFEST, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_DYNAMIC, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_PINNED, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_CACHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutManagerCompat.ShortcutMatchFlags {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ShortcutXmlParser {
+    method @WorkerThread public static java.util.List<java.lang.String!> getShortcutIds(android.content.Context);
+    method @VisibleForTesting public static java.util.List<java.lang.String!> parseShortcutIds(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.core.content.res {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+    method @ColorInt public int getColor();
+    method public android.graphics.Shader? getShader();
+    method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+    method public boolean isGradient();
+    method public boolean isStateful();
+    method public boolean onStateChanged(int[]!);
+    method public void setColor(@ColorInt int);
+    method public boolean willDraw();
+  }
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+    method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser, android.content.res.Resources) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static java.util.List<java.util.List<byte[]!>!> readCerts(android.content.res.Resources, @ArrayRes int);
+    field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+    field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+    field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+  }
+
+  public static interface FontResourcesParserCompat.FamilyResourceEntry {
+  }
+
+  @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+  }
+
+  public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+    method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+  }
+
+  public static final class FontResourcesParserCompat.FontFileResourceEntry {
+    ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+    method public String getFileName();
+    method public int getResourceId();
+    method public int getTtcIndex();
+    method public String? getVariationSettings();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+    method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+    method public androidx.core.provider.FontRequest getRequest();
+    method public int getTimeout();
+  }
+
+  public final class ResourcesCompat {
+    method public static void clearCachesForTheme(android.content.res.Resources.Theme);
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int, android.util.TypedValue, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface, android.os.Handler?);
+    method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+    method public static int getAttr(android.content.Context, int, int);
+    method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+    method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+    method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+    method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+    method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+    method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+    method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+    method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+    method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+    method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+    method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+    method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+    method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, android.graphics.Rect?, boolean);
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
+    method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static void clearCache();
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, @IntRange(from=1, to=1000) int, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+  }
+
+  @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi26Impl();
+    method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+    method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    field protected final java.lang.reflect.Method! mAbortCreation;
+    field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+    field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+    field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+    field protected final Class<?>! mFontFamily;
+    field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+    field protected final java.lang.reflect.Method! mFreeze;
+  }
+
+  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi28Impl();
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+    ctor public TypefaceCompatApi29Impl();
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+    method public static void closeQuietly(java.io.Closeable?);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context, android.content.res.Resources, int);
+    method public static boolean copyToFile(java.io.File, java.io.InputStream);
+    method public static boolean copyToFile(java.io.File, android.content.res.Resources, int);
+    method public static java.io.File? getTempFile(android.content.Context);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context, android.os.CancellationSignal?, android.net.Uri);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode?);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.res.Resources?, String, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+    method @DrawableRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.ParcelField(value=1, defaultValue="androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN") public int mType;
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+    method public void setTint(@ColorInt int);
+    method public void setTintList(android.content.res.ColorStateList!);
+    method public void setTintMode(android.graphics.PorterDuff.Mode!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.internal.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+    method public void setGroupDividerEnabled(boolean);
+    field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+    field public static final int CATEGORY_SHIFT = 16; // 0x10
+    field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+    field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+    field public static final int USER_MASK = 65535; // 0xffff
+    field public static final int USER_SHIFT = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+    method public int getAlphabeticModifiers();
+    method public CharSequence? getContentDescription();
+    method public android.content.res.ColorStateList? getIconTintList();
+    method public android.graphics.PorterDuff.Mode? getIconTintMode();
+    method public int getNumericModifiers();
+    method public androidx.core.view.ActionProvider? getSupportActionProvider();
+    method public CharSequence? getTooltipText();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem setAlphabeticShortcut(char, int);
+    method public androidx.core.internal.view.SupportMenuItem setContentDescription(CharSequence?);
+    method public android.view.MenuItem setIconTintList(android.content.res.ColorStateList?);
+    method public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff.Mode?);
+    method public android.view.MenuItem setNumericShortcut(char, int);
+    method public android.view.MenuItem setShortcut(char, char, int, int);
+    method public androidx.core.internal.view.SupportMenuItem setSupportActionProvider(androidx.core.view.ActionProvider?);
+    method public androidx.core.internal.view.SupportMenuItem setTooltipText(CharSequence?);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method @FloatRange(from=0.0) public static float getMslAltitudeAccuracyMeters(android.location.Location);
+    method public static double getMslAltitudeMeters(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasMslAltitude(android.location.Location);
+    method public static boolean hasMslAltitudeAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void removeMslAltitude(android.location.Location);
+    method public static void removeMslAltitudeAccuracy(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setMslAltitudeAccuracyMeters(android.location.Location, @FloatRange(from=0.0) float);
+    method public static void setMslAltitudeMeters(android.location.Location, double);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_MSL_ALTITUDE = "androidx.core.location.extra.MSL_ALTITUDE";
+    field public static final String EXTRA_MSL_ALTITUDE_ACCURACY = "androidx.core.location.extra.MSL_ALTITUDE_ACCURACY";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback, android.os.Handler);
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssMeasurementsCallback(android.location.LocationManager, java.util.concurrent.Executor, android.location.GnssMeasurementsEvent.Callback);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static void unregisterGnssMeasurementsCallback(android.location.LocationManager, android.location.GnssMeasurementsEvent.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @Deprecated @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+    field @ChecksSdkIntAtLeast(extension=android.os.ext.SdkExtensions.AD_SERVICES) public static final int AD_SERVICES_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.R) public static final int R_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.S) public static final int S_EXTENSION_INT;
+    field @ChecksSdkIntAtLeast(extension=android.os.Build.VERSION_CODES.TIRAMISU) public static final int T_EXTENSION_INT;
+  }
+
+  public final class BundleCompat {
+    method public static <T> T? getParcelable(android.os.Bundle, String?, Class<T!>);
+    method public static android.os.Parcelable![]? getParcelableArray(android.os.Bundle, String?, Class<? extends android.os.Parcelable>);
+    method public static <T> java.util.ArrayList<T!>? getParcelableArrayList(android.os.Bundle, String?, Class<? extends T>);
+    method public static <T> android.util.SparseArray<T!>? getSparseParcelableArray(android.os.Bundle, String?, Class<? extends T>);
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale? get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale?);
+    method public boolean isEmpty();
+    method @RequiresApi(21) public static boolean matchesLanguageAndScript(java.util.Locale, java.util.Locale);
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static <T> Object![]? readArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> java.util.ArrayList<T!>? readArrayList(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static <K, V> java.util.HashMap<K!,V!>? readHashMap(android.os.Parcel, ClassLoader?, Class<? extends K>, Class<? extends V>);
+    method public static <T> void readList(android.os.Parcel, java.util.List<? super T>, ClassLoader?, Class<T!>);
+    method public static <K, V> void readMap(android.os.Parcel, java.util.Map<? super K,? super V>, ClassLoader?, Class<K!>, Class<V!>);
+    method public static <T extends android.os.Parcelable> T? readParcelable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @Deprecated public static <T> T![]? readParcelableArray(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.os.Parcelable![]? readParcelableArrayTyped(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(30) public static <T> android.os.Parcelable.Creator<T!>? readParcelableCreator(android.os.Parcel, ClassLoader?, Class<T!>);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.Q) public static <T> java.util.List<T!> readParcelableList(android.os.Parcel, java.util.List<T!>, ClassLoader?, Class<T!>);
+    method public static <T extends java.io.Serializable> T? readSerializable(android.os.Parcel, ClassLoader?, Class<T!>);
+    method public static <T> android.util.SparseArray<T!>? readSparseArray(android.os.Parcel, ClassLoader?, Class<? extends T>);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+    ctor @Deprecated public SelfDestructiveThread(String!, int, int);
+    method @Deprecated @VisibleForTesting public int getGeneration();
+    method @Deprecated @VisibleForTesting public boolean isRunning();
+    method @Deprecated public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+    method @Deprecated public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+  }
+
+  @Deprecated public static interface SelfDestructiveThread.ReplyCallback<T> {
+    method @Deprecated public void onReply(T!);
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+  @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+    method public static void buildShortClassTag(Object!, StringBuilder!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+    ctor @Deprecated public LogWriter(String!);
+    method @Deprecated public void close();
+    method @Deprecated public void flush();
+    method @Deprecated public void write(char[]!, int, int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_EMAIL_ADDRESS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_WEB_URL;
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+    method public static void checkArgument(boolean);
+    method public static void checkArgument(boolean, Object);
+    method public static void checkArgument(boolean, String, java.lang.Object!...);
+    method public static float checkArgumentFinite(float, String);
+    method public static int checkArgumentInRange(int, int, int, String);
+    method public static long checkArgumentInRange(long, long, long, String);
+    method public static float checkArgumentInRange(float, float, float, String);
+    method public static double checkArgumentInRange(double, double, double, String);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+    method public static int checkFlagsArgument(int, int);
+    method public static <T> T checkNotNull(T?);
+    method public static <T> T checkNotNull(T?, Object);
+    method public static void checkState(boolean, String?);
+    method public static void checkState(boolean);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, Object);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, String, java.lang.Object!...);
+  }
+
+  public interface Predicate<T> {
+    method public default androidx.core.util.Predicate<T!>! and(androidx.core.util.Predicate<? super T>!);
+    method public static <T> androidx.core.util.Predicate<T!>! isEqual(Object!);
+    method public default androidx.core.util.Predicate<T!>! negate();
+    method public static <T> androidx.core.util.Predicate<T!>! not(androidx.core.util.Predicate<? super T>!);
+    method public default androidx.core.util.Predicate<T!>! or(androidx.core.util.Predicate<? super T>!);
+    method public boolean test(T!);
+  }
+
+  public final class SizeFCompat {
+    ctor public SizeFCompat(float, float);
+    method public float getHeight();
+    method public float getWidth();
+    method @RequiresApi(21) public android.util.SizeF toSizeF();
+    method @RequiresApi(21) public static androidx.core.util.SizeFCompat toSizeFCompat(android.util.SizeF);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener?);
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+    method public void onSubUiVisibilityChanged(boolean);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method @androidx.core.view.ContentInfoCompat.Flags public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method @androidx.core.view.ContentInfoCompat.Source public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, @androidx.core.view.ContentInfoCompat.Source int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(@androidx.core.view.ContentInfoCompat.Flags int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(@androidx.core.view.ContentInfoCompat.Source int);
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Flags {
+  }
+
+  @IntDef({androidx.core.view.ContentInfoCompat.SOURCE_APP, androidx.core.view.ContentInfoCompat.SOURCE_CLIPBOARD, androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD, androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP, androidx.core.view.ContentInfoCompat.SOURCE_AUTOFILL, androidx.core.view.ContentInfoCompat.SOURCE_PROCESS_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Source {
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect?, java.util.List<android.graphics.Rect!>?);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity, android.view.DragEvent);
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, androidx.core.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View, androidx.core.view.DragStartHelper);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler?);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener?);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+    method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+    method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+  }
+
+  public static interface KeyEventDispatcher.Component {
+    method public boolean superDispatchKeyEvent(android.view.KeyEvent);
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void onPrepareMenu(android.view.Menu);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider? getActionProvider(android.view.MenuItem);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static CharSequence? getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList? getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode? getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static CharSequence? getTooltipText(android.view.MenuItem);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem? setActionProvider(android.view.MenuItem, androidx.core.view.ActionProvider?);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, CharSequence?);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList?);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode?);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem, CharSequence?);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public default void onMenuClosed(android.view.Menu);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public default void onPrepareMenu(android.view.Menu);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent {
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View);
+    method public void onViewDetachedFromWindow(android.view.View);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object? getPointerIcon();
+    method public static androidx.core.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static androidx.core.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method @Deprecated public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, @androidx.core.view.ViewCompat.FocusDirection int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+  }
+
+  @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setListener(androidx.core.view.ViewPropertyAnimatorListener?);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener?);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withEndAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat withStartAction(Runnable);
+    method public androidx.core.view.ViewPropertyAnimatorCompat x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(@androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode int);
+    method @androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsAnimationCompat.Callback.DispatchMode {
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int captionBar();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int displayCutout();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int ime();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int mandatorySystemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int navigationBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int statusBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int tappableElement();
+  }
+
+  @IntDef(flag=true, value={0x1, 0x2, 0x4, 0x8, 0x100, 0x10, 0x20, 0x40, 0x80}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsCompat.Type.InsetsType {
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_DEFAULT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, int);
+    method public void onClick(android.view.View);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent);
+    method @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_DROPPED = 256; // 0x100
+    field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_DRAG_STARTED, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_DRAG_DROPPED, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_DRAG_CANCELLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AccessibilityEventCompat.ContentChangeType {
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method @Deprecated public int getActions();
+    method public java.util.List<java.lang.String!> getAvailableExtraData();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMinMillisBetweenContentChanges();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String? getUniqueId();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean hasRequestInitialAccessibilityFocus();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isTextSelectable();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method @Deprecated public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMinMillisBetweenContentChanges(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRequestInitialAccessibilityFocus(boolean);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelectable(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setUniqueId(String?);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final int EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH = 20000; // 0x4e20
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.core.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_CANCEL;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_DROP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DRAG_START;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_TEXT_SUGGESTIONS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object?);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object? getProvider();
+    method public boolean performAction(int, int, android.os.Bundle?);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View?, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle?);
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String? getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence? getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getChild(int);
+    method public int getChildCount();
+    method public int getDisplayId();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getParent();
+    method public void getRegionInScreen(android.graphics.Region);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getRoot();
+    method public CharSequence? getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public boolean isInPictureInPictureMode();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat?);
+    method @Deprecated public void recycle();
+    method public android.view.accessibility.AccessibilityWindowInfo? unwrap();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+    method public int getAutoSizeMaxTextSize();
+    method public int getAutoSizeMinTextSize();
+    method public int getAutoSizeStepGranularity();
+    method public int[]! getAutoSizeTextAvailableSizes();
+    method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextViewOnReceiveContentListener implements androidx.core.view.OnReceiveContentListener {
+    ctor public TextViewOnReceiveContentListener();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableCheckedTextView {
+    method public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+    method public android.content.res.ColorStateList? getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/restricted_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/build.gradle b/core/core/build.gradle
index 3f464c5..2f93e91 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -12,7 +12,7 @@
         implementation(project(":core:core-ktx"))
     }
 
-    api(projectOrArtifact(":annotation:annotation"))
+    api("androidx.annotation:annotation:1.6.0")
     api("androidx.annotation:annotation-experimental:1.3.0")
     api("androidx.lifecycle:lifecycle-runtime:2.3.1")
     api("androidx.versionedparcelable:versionedparcelable:1.1.1")
@@ -20,9 +20,6 @@
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.interpolator:interpolator:1.0.0")
 
-    // Required for -Werror due to annotation-experimental use of Kotlin
-    compileOnly(libs.kotlinStdlib)
-
     // We don't ship this as a public artifact, so it must remain a project-type dependency.
     annotationProcessor(projectOrArtifact(":versionedparcelable:versionedparcelable-compiler"))
 
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..5ffca2f 100644
--- a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
@@ -304,6 +304,11 @@
         // notification is built successfully (without throwing an exception).
         NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
 
+        Notification nDefault = builder.build();
+        if (Build.VERSION.SDK_INT >= 19) {
+            assertThat(NotificationCompat.getShowWhen(nDefault)).isTrue();
+        }
+
         // test true
         Notification nTrue = builder.setShowWhen(true).build();
         if (Build.VERSION.SDK_INT >= 19) {
@@ -1411,7 +1416,7 @@
                 .setSmallIcon(1)
                 .setStyle(new NotificationCompat.BigPictureStyle()
                         .bigPicture(bitmap)
-                        .bigLargeIcon(null)
+                        .bigLargeIcon((Bitmap) null)
                         .setBigContentTitle("Big Content Title")
                         .setSummaryText("Summary Text"))
                 .build();
@@ -1424,6 +1429,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 +2597,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/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..d965579 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -1278,9 +1278,6 @@
         /**
          * Set the time that the event occurred.  Notifications in the panel are
          * sorted by this time.
-         *
-         * <p>For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this time is
-         * not shown anymore by default and must be opted into using {@link #setShowWhen(boolean)}
          */
         public @NonNull Builder setWhen(long when) {
             mNotification.when = when;
@@ -1289,10 +1286,7 @@
 
         /**
          * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
-         * in the content view.
-         *
-         * <p>For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this
-         * defaults to {@code false}. For earlier apps, the default is {@code true}.
+         * in the content view. The default is {@code true}.
          */
         public @NonNull Builder setShowWhen(boolean show) {
             mShowWhen = show;
@@ -2497,7 +2491,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 +3357,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 +4958,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 +5290,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/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/build.gradle b/credentials/credentials-play-services-auth/build.gradle
index 4cbcb8c..f2ecf59 100644
--- a/credentials/credentials-play-services-auth/build.gradle
+++ b/credentials/credentials-play-services-auth/build.gradle
@@ -26,6 +26,10 @@
     api(libs.kotlinStdlib)
     api project(":credentials:credentials")
 
+    implementation("com.google.android.libraries.identity.googleid:googleid:0.0.2"){
+        exclude group: "androidx.credentials"
+    }
+
     // Closed source dependencies
     implementation(libs.playServicesAuth) {
         exclude group: "androidx.loader"
diff --git a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerJavaTest.java b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerJavaTest.java
index 5db9701..27c9b68 100644
--- a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerJavaTest.java
+++ b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerJavaTest.java
@@ -29,6 +29,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.google.android.gms.auth.api.identity.BeginSignInRequest;
+import com.google.android.libraries.identity.googleid.GetGoogleIdOption;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,8 +41,7 @@
 @SuppressWarnings("deprecation")
 public class CredentialProviderBeginSignInControllerJavaTest {
     @Test
-    public void
-            convertRequestToPlayServices_setPasswordOptionRequestAndFalseAutoSelect_success() {
+    public void convertRequestToPlayServices_setPasswordOptionRequestAndFalseAutoSelect_success() {
         ActivityScenario<TestCredentialsActivity> activityScenario =
                 ActivityScenario.launch(TestCredentialsActivity.class);
         activityScenario.onActivity(activity -> {
@@ -66,10 +66,10 @@
 
             BeginSignInRequest actualResponse =
                     CredentialProviderBeginSignInController
-                        .getInstance(activity)
-                        .convertRequestToPlayServices(new GetCredentialRequest(List.of(
-                                new GetPasswordOption()
-                        ), true));
+                            .getInstance(activity)
+                            .convertRequestToPlayServices(new GetCredentialRequest(List.of(
+                                    new GetPasswordOption()
+                            ), true));
 
             assertThat(actualResponse.getPasswordRequestOptions().isSupported()).isTrue();
             assertThat(actualResponse.isAutoSelectEnabled()).isTrue();
@@ -107,4 +107,44 @@
             );
         });
     }
+
+    @Test
+    public void convertRequestToPlayServices_setGoogleIdOptionRequestAndTrueAutoSelect_success() {
+        ActivityScenario<TestCredentialsActivity> activityScenario =
+                ActivityScenario.launch(TestCredentialsActivity.class);
+
+        GetGoogleIdOption option = new GetGoogleIdOption.Builder()
+                .setServerClientId("server_client_id")
+                .setNonce("nonce")
+                .setFilterByAuthorizedAccounts(true)
+                .setRequestVerifiedPhoneNumber(false)
+                .associatedLinkedAccounts("link_service_id", List.of("a", "b", "c"))
+                .build();
+
+        activityScenario.onActivity(activity -> {
+
+            BeginSignInRequest actualRequest =
+                    CredentialProviderBeginSignInController
+                            .getInstance(activity)
+                            .convertRequestToPlayServices(new GetCredentialRequest(List.of(
+                                    option
+                            ), true));
+
+            assertThat(actualRequest.getGoogleIdTokenRequestOptions().isSupported()).isTrue();
+            assertThat(actualRequest.isAutoSelectEnabled()).isTrue();
+
+            BeginSignInRequest.GoogleIdTokenRequestOptions actualOption =
+                    actualRequest.getGoogleIdTokenRequestOptions();
+            assertThat(actualOption.getServerClientId()).isEqualTo(option.getServerClientId());
+            assertThat(actualOption.getNonce()).isEqualTo(option.getNonce());
+            assertThat(actualOption.filterByAuthorizedAccounts()).isEqualTo(
+                    option.getFilterByAuthorizedAccounts());
+            assertThat(actualOption.requestVerifiedPhoneNumber()).isEqualTo(
+                    option.getRequestVerifiedPhoneNumber());
+            assertThat(actualOption.getLinkedServiceId()).isEqualTo(option.getLinkedServiceId());
+            assertThat(actualOption.getIdTokenDepositionScopes()).isEqualTo(
+                    option.getIdTokenDepositionScopes());
+
+        });
+    }
 }
diff --git a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerTest.kt b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerTest.kt
index c648f28..461e8a3 100644
--- a/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerTest.kt
+++ b/credentials/credentials-play-services-auth/src/androidTest/java/androidx/credentials/playservices/beginsignin/CredentialProviderBeginSignInControllerTest.kt
@@ -25,6 +25,7 @@
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.google.android.libraries.identity.googleid.GetGoogleIdOption
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -75,4 +76,44 @@
             assertThat(actualResponse.isAutoSelectEnabled).isTrue()
         }
     }
+
+    @Test
+    fun convertRequestToPlayServices_setGoogleIdOptionRequest_success() {
+        val activityScenario = ActivityScenario.launch(
+            TestCredentialsActivity::class.java
+        )
+
+        val option = GetGoogleIdOption.Builder()
+            .setServerClientId("server_client_id")
+            .setNonce("nonce")
+            .setFilterByAuthorizedAccounts(true)
+            .setRequestVerifiedPhoneNumber(false)
+            .associatedLinkedAccounts("link_service_id", listOf("a", "b", "c"))
+            .build()
+
+        activityScenario.onActivity { activity: TestCredentialsActivity? ->
+            val actualRequest = getInstance(activity!!)
+                .convertRequestToPlayServices(
+                    GetCredentialRequest(
+                        listOf(
+                            option
+                        ), true
+                    )
+                )
+            assertThat(
+                actualRequest.googleIdTokenRequestOptions.isSupported
+            ).isTrue()
+            assertThat(actualRequest.isAutoSelectEnabled).isTrue()
+            val actualOption = actualRequest.googleIdTokenRequestOptions
+            assertThat(actualOption.serverClientId).isEqualTo(option.serverClientId)
+            assertThat(actualOption.nonce).isEqualTo(option.nonce)
+            assertThat(actualOption.filterByAuthorizedAccounts())
+                .isEqualTo(option.filterByAuthorizedAccounts)
+            assertThat(actualOption.requestVerifiedPhoneNumber())
+                .isEqualTo(option.requestVerifiedPhoneNumber)
+            assertThat(actualOption.linkedServiceId).isEqualTo(option.linkedServiceId)
+            assertThat(actualOption.idTokenDepositionScopes)
+                .isEqualTo(option.idTokenDepositionScopes)
+        }
+    }
 }
\ No newline at end of file
diff --git a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/BeginSignInControllerUtility.kt b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/BeginSignInControllerUtility.kt
index 3f915a5..c842429 100644
--- a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/BeginSignInControllerUtility.kt
+++ b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/BeginSignInControllerUtility.kt
@@ -37,6 +37,8 @@
 import androidx.credentials.GetPublicKeyCredentialOption
 import androidx.credentials.playservices.controllers.CreatePublicKeyCredential.PublicKeyCredentialControllerUtility.Companion.convertToPlayAuthPasskeyRequest
 import com.google.android.gms.auth.api.identity.BeginSignInRequest
+import com.google.android.gms.auth.api.identity.BeginSignInRequest.GoogleIdTokenRequestOptions
+import com.google.android.libraries.identity.googleid.GetGoogleIdOption
 
 /**
  * A utility class to handle logic for the begin sign in controller.
@@ -65,12 +67,32 @@
                     )
                     isPublicKeyCredReqFound = true
                     // TODO("Confirm logic for single vs multiple options of the same type")
+                } else if (option is GetGoogleIdOption) {
+                    requestBuilder.setGoogleIdTokenRequestOptions(
+                        convertToGoogleIdTokenOption(option))
                 }
-            // TODO("Add GoogleIDToken version")
             }
             return requestBuilder
                 .setAutoSelectEnabled(request.isAutoSelectAllowed)
                 .build()
         }
+
+        private fun convertToGoogleIdTokenOption(option: GetGoogleIdOption):
+          GoogleIdTokenRequestOptions {
+            var idTokenOption =
+                GoogleIdTokenRequestOptions.builder()
+                    .setFilterByAuthorizedAccounts(option.filterByAuthorizedAccounts)
+                    .setNonce(option.nonce)
+                    .setRequestVerifiedPhoneNumber(option.requestVerifiedPhoneNumber)
+                    .setServerClientId(option.serverClientId)
+                    .setSupported(true)
+            if (option.linkedServiceId != null) {
+                idTokenOption.associateLinkedAccounts(
+                    option.linkedServiceId!!,
+                    option.idTokenDepositionScopes
+                )
+            }
+            return idTokenOption.build()
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/CredentialProviderBeginSignInController.kt b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/CredentialProviderBeginSignInController.kt
index 4dbc5d5..e1ca866 100644
--- a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/CredentialProviderBeginSignInController.kt
+++ b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/BeginSignIn/CredentialProviderBeginSignInController.kt
@@ -46,6 +46,7 @@
 import com.google.android.gms.auth.api.identity.SignInCredential
 import com.google.android.gms.common.api.ApiException
 import com.google.android.gms.common.api.CommonStatusCodes
+import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
 import java.util.concurrent.Executor
 
 /**
@@ -56,11 +57,11 @@
 @Suppress("deprecation")
 class CredentialProviderBeginSignInController(private val activity: Activity) :
     CredentialProviderController<
-    GetCredentialRequest,
-    BeginSignInRequest,
-    SignInCredential,
-    GetCredentialResponse,
-    GetCredentialException>(activity) {
+        GetCredentialRequest,
+        BeginSignInRequest,
+        SignInCredential,
+        GetCredentialResponse,
+        GetCredentialException>(activity) {
 
     /**
      * The callback object state, used in the protected handleResponse method.
@@ -68,6 +69,7 @@
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     lateinit var callback: CredentialManagerCallback<GetCredentialResponse,
         GetCredentialException>
+
     /**
      * The callback requires an executor to invoke it.
      */
@@ -88,12 +90,17 @@
             resultCode: Int,
             resultData: Bundle
         ) {
-            if (maybeReportErrorFromResultReceiver(resultData,
+            if (maybeReportErrorFromResultReceiver(
+                    resultData,
                     CredentialProviderBaseController
                         .Companion::getCredentialExceptionTypeToException,
-                    executor = executor, callback = callback, cancellationSignal)) return
-            handleResponse(resultData.getInt(ACTIVITY_REQUEST_CODE_TAG), resultCode,
-                resultData.getParcelable(RESULT_DATA_TAG))
+                    executor = executor, callback = callback, cancellationSignal
+                )
+            ) return
+            handleResponse(
+                resultData.getInt(ACTIVITY_REQUEST_CODE_TAG), resultCode,
+                resultData.getParcelable(RESULT_DATA_TAG)
+            )
         }
     }
 
@@ -107,7 +114,9 @@
         this.callback = callback
         this.executor = executor
 
-        if (CredentialProviderPlayServicesImpl.cancellationReviewer(cancellationSignal)) { return }
+        if (CredentialProviderPlayServicesImpl.cancellationReviewer(cancellationSignal)) {
+            return
+        }
 
         val convertedRequest: BeginSignInRequest = this.convertRequestToPlayServices(request)
         val hiddenIntent = Intent(activity, HiddenActivity::class.java)
@@ -118,19 +127,30 @@
 
     internal fun handleResponse(uniqueRequestCode: Int, resultCode: Int, data: Intent?) {
         if (uniqueRequestCode != CONTROLLER_REQUEST_CODE) {
-            Log.w(TAG, "Returned request code " +
-                "$CONTROLLER_REQUEST_CODE which does not match what was given $uniqueRequestCode")
+            Log.w(
+                TAG,
+                "Returned request code $CONTROLLER_REQUEST_CODE which " +
+                    " does not match what was given $uniqueRequestCode"
+            )
             return
         }
         if (maybeReportErrorResultCodeGet(resultCode, TAG,
-                { s, f -> cancelOrCallbackExceptionOrResult(s, f) }, { e -> this.executor.execute {
-                    this.callback.onError(e) } }, cancellationSignal)) return
+                { s, f -> cancelOrCallbackExceptionOrResult(s, f) }, { e ->
+                    this.executor.execute {
+                        this.callback.onError(e)
+                    }
+                }, cancellationSignal
+            )
+        ) return
         try {
             val signInCredential = Identity.getSignInClient(activity)
                 .getSignInCredentialFromIntent(data)
             val response = convertResponseToCredentialManager(signInCredential)
-            cancelOrCallbackExceptionOrResult(cancellationSignal) { this.executor.execute {
-                    this.callback.onResult(response) } }
+            cancelOrCallbackExceptionOrResult(cancellationSignal) {
+                this.executor.execute {
+                    this.callback.onResult(response)
+                }
+            }
         } catch (e: ApiException) {
             var exception: GetCredentialException = GetCredentialUnknownException(e.message)
             if (e.statusCode == CommonStatusCodes.CANCELED) {
@@ -138,12 +158,18 @@
             } else if (e.statusCode in retryables) {
                 exception = GetCredentialInterruptedException(e.message)
             }
-            cancelOrCallbackExceptionOrResult(cancellationSignal) { executor.execute {
-                callback.onError(exception) } }
+            cancelOrCallbackExceptionOrResult(cancellationSignal) {
+                executor.execute {
+                    callback.onError(exception)
+                }
+            }
             return
         } catch (e: GetCredentialException) {
-            cancelOrCallbackExceptionOrResult(cancellationSignal) { executor.execute {
-                callback.onError(e) } }
+            cancelOrCallbackExceptionOrResult(cancellationSignal) {
+                executor.execute {
+                    callback.onError(e)
+                }
+            }
         }
     }
 
@@ -160,7 +186,7 @@
         if (response.password != null) {
             cred = PasswordCredential(response.id, response.password!!)
         } else if (response.googleIdToken != null) {
-            TODO(" Implement GoogleIdTokenVersion")
+            cred = createGoogleIdCredential(response)
         } else if (response.publicKeyCredential != null) {
             try {
                 cred = PublicKeyCredential(
@@ -173,16 +199,44 @@
             Log.w(TAG, "Credential returned but no google Id or password or passkey found")
         }
         if (cred == null) {
-            throw GetCredentialUnknownException("When attempting to convert get response, " +
-                "null credential found")
+            throw GetCredentialUnknownException(
+                "When attempting to convert get response, " +
+                    "null credential found"
+            )
         }
         return GetCredentialResponse(cred)
     }
 
+    private fun createGoogleIdCredential(response: SignInCredential): GoogleIdTokenCredential {
+        var cred = GoogleIdTokenCredential.Builder().setId(response.id)
+            .setIdToken(response.googleIdToken!!)
+
+        if (response.displayName != null) {
+            cred.setDisplayName(response.displayName)
+        }
+
+        if (response.givenName != null) {
+            cred.setGivenName(response.givenName)
+        }
+
+        if (response.familyName != null) {
+            cred.setFamilyName(response.familyName)
+        }
+
+        if (response.phoneNumber != null) {
+            cred.setPhoneNumber(response.phoneNumber)
+        }
+
+        if (response.profilePictureUri != null) {
+            cred.setProfilePictureUri(response.profilePictureUri.toString())
+        }
+
+        return cred.build()
+    }
+
     companion object {
         private val TAG = CredentialProviderBeginSignInController::class.java.name
         private var controller: CredentialProviderBeginSignInController? = null
-        // TODO("Ensure this is tested for multiple calls")
 
         /**
          * This finds a past version of the [CredentialProviderBeginSignInController] if it exists,
@@ -200,4 +254,4 @@
             return controller!!
         }
     }
-}
\ No newline at end of file
+}
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/main/java/androidx/credentials/CreatePublicKeyCredentialRequest.kt b/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequest.kt
index 1e80938..2b703e9 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequest.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequest.kt
@@ -25,7 +25,7 @@
 /**
  * A request to register a passkey from the user's public key credential provider.
  *
- * @property requestJson the privileged request in JSON format in the [standard webauthn web json](https://w3c.github.io/webauthn/#dictdef-publickeycredentialcreationoptionsjson).
+ * @property requestJson the request in JSON format in the [standard webauthn web json](https://w3c.github.io/webauthn/#dictdef-publickeycredentialcreationoptionsjson).
  * @property preferImmediatelyAvailableCredentials true if you prefer the operation to return
  * immediately when there is no available passkey registration offering instead of falling back to
  * discovering remote options, and false (default) otherwise
@@ -145,4 +145,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivileged.kt b/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivileged.kt
index 9c888b5..7dca9b9 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivileged.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivileged.kt
@@ -25,7 +25,7 @@
  * the caller can modify the rp. Only callers with privileged permission, e.g. user’s default
  * browser, caBLE, can use this. These permissions will be introduced in an upcoming release.
  *
- * @property requestJson the privileged request in JSON format in the [standard webauthn web json](https://w3c.github.io/webauthn/#dictdef-publickeycredentialcreationoptionsjson).
+ * @property requestJson the request in JSON format in the [standard webauthn web json](https://w3c.github.io/webauthn/#dictdef-publickeycredentialcreationoptionsjson).
  * @property preferImmediatelyAvailableCredentials true if you prefer the operation to return
  * immediately when there is no available passkey registration offering instead of falling back to
  * discovering remote options, and false (default) otherwise
diff --git a/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOption.kt b/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOption.kt
index c8ae8f0..a9e0507 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOption.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOption.kt
@@ -22,7 +22,7 @@
 /**
  * A request to get passkeys from the user's public key credential provider.
  *
- * @property requestJson the privileged request in JSON format in the standard webauthn web json
+ * @property requestJson the request in JSON format in the standard webauthn web json
  * shown [here](https://w3c.github.io/webauthn/#dictdef-publickeycredentialrequestoptionsjson).
  * @property preferImmediatelyAvailableCredentials true if you prefer the operation to return
  * immediately when there is no available credential instead of falling back to discovering remote
@@ -83,4 +83,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOptionPrivileged.kt b/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOptionPrivileged.kt
index 4c30a64..cdaae8c 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOptionPrivileged.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetPublicKeyCredentialOptionPrivileged.kt
@@ -25,7 +25,7 @@
  * can use this. These permissions will be introduced in an upcoming release.
  * TODO("Add specific permission info/annotation")
  *
- * @property requestJson the privileged request in JSON format in the standard webauthn web json
+ * @property requestJson the request in JSON format in the standard webauthn web json
  * shown [here](https://w3c.github.io/webauthn/#dictdef-publickeycredentialrequestoptionsjson).
  * @property preferImmediatelyAvailableCredentials true if you prefer the operation to return
  * immediately when there is no available credential instead of falling back to discovering remote
@@ -180,4 +180,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnknownException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnknownException.kt
index 5ea3bf9..e241f6c 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnknownException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnknownException.kt
@@ -28,6 +28,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_CLEAR_CREDENTIAL_UNKNOWN_EXCEPTION =
-            "androidx.credentials.TYPE_CLEAR_CREDENTIAL_UNKNOWN_EXCEPTION"
+            "android.credentials.ClearCredentialStateException.TYPE_UNKNOWN"
     }
 }
\ No newline at end of file
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/CreateCredentialCancellationException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialCancellationException.kt
index e287206..4cd52f6 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialCancellationException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialCancellationException.kt
@@ -30,6 +30,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_CREATE_CREDENTIAL_CANCELLATION_EXCEPTION =
-            "androidx.credentials.TYPE_CREATE_CREDENTIAL_CANCELLATION_EXCEPTION"
+            "android.credentials.CreateCredentialException.TYPE_USER_CANCELED"
     }
 }
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialInterruptedException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialInterruptedException.kt
index ae93ab9..cd78998 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialInterruptedException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialInterruptedException.kt
@@ -29,7 +29,7 @@
 
     /** @hide */
     companion object {
-        internal val TYPE_CREATE_CREDENTIAL_INTERRUPTED_EXCEPTION =
-            "androidx.credentials.TYPE_CREATE_CREDENTIAL_INTERRUPTED_EXCEPTION"
+        internal const val TYPE_CREATE_CREDENTIAL_INTERRUPTED_EXCEPTION =
+            "android.credentials.CreateCredentialException.TYPE_INTERRUPTED"
     }
 }
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnknownException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnknownException.kt
index 91eef4a..40b2476 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnknownException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnknownException.kt
@@ -28,6 +28,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_CREATE_CREDENTIAL_UNKNOWN_EXCEPTION =
-            "androidx.credentials.TYPE_CREATE_CREDENTIAL_UNKNOWN_EXCEPTION"
+            "android.credentials.CreateCredentialException.TYPE_UNKNOWN"
     }
 }
\ No newline at end of file
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/GetCredentialCancellationException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialCancellationException.kt
index 38dcc06..044dec8 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialCancellationException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialCancellationException.kt
@@ -30,6 +30,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_GET_CREDENTIAL_CANCELLATION_EXCEPTION =
-            "androidx.credentials.TYPE_GET_CREDENTIAL_CANCELLATION_EXCEPTION"
+            "android.credentials.GetCredentialException.TYPE_USER_CANCELED"
     }
 }
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialInterruptedException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialInterruptedException.kt
index fc11a1a..816ca8d 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialInterruptedException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialInterruptedException.kt
@@ -30,6 +30,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_GET_CREDENTIAL_INTERRUPTED_EXCEPTION =
-            "androidx.credentials.TYPE_GET_CREDENTIAL_INTERRUPTED_EXCEPTION"
+            "android.credentials.GetCredentialException.TYPE_INTERRUPTED"
     }
 }
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnknownException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnknownException.kt
index 162446f..b75ad50 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnknownException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnknownException.kt
@@ -28,6 +28,6 @@
     /** @hide */
     companion object {
         internal const val TYPE_GET_CREDENTIAL_UNKNOWN_EXCEPTION =
-            "androidx.credentials.TYPE_GET_CREDENTIAL_UNKNOWN_EXCEPTION"
+            "android.credentials.GetCredentialException.TYPE_UNKNOWN"
     }
 }
\ No newline at end of file
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/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/auto-version-updater/update_versions_for_release.py b/development/auto-version-updater/update_versions_for_release.py
index 0cd1cd8..008f4846b 100755
--- a/development/auto-version-updater/update_versions_for_release.py
+++ b/development/auto-version-updater/update_versions_for_release.py
@@ -315,7 +315,10 @@
 
     # Open file for writing and write toml back
     with open(LIBRARY_VERSIONS_FP, 'w') as f:
-        toml.dump(library_versions, f, encoder=toml.TomlPreserveInlineDictEncoder())
+        versions_toml_file_string = toml.dumps(library_versions, encoder=toml.TomlPreserveInlineDictEncoder())
+        versions_toml_file_string_new = re.sub(",]", " ]", versions_toml_file_string)
+        f.write(versions_toml_file_string_new)
+
     return updated_version
 
 
@@ -471,7 +474,7 @@
         msg = "Update versions for release id %s\n\nThis commit was generated from the command:\n%s\n\n%s" % (
             release_date, " ".join(sys.argv), "Test: ./gradlew checkApi")
         subprocess.check_call(["git", "commit", "-m", msg], cwd=dir, stderr=subprocess.STDOUT)
-        subprocess.check_call(["repo", "upload", ".", "--cbr", "-t", "-y", "--label", "Presubmit-Ready+1"], cwd=dir,
+        subprocess.check_call(["repo", "upload", ".", "--cbr", "-t", "-y", "-o", "banned-words~skip", "--label", "Presubmit-Ready+1"], cwd=dir,
                               stderr=subprocess.STDOUT)
 
 def main(args):
diff --git a/development/project-creator/create_project.py b/development/project-creator/create_project.py
index bc1db8e..8a121f8 100755
--- a/development/project-creator/create_project.py
+++ b/development/project-creator/create_project.py
@@ -25,6 +25,7 @@
 from shutil import copyfile
 from distutils.dir_util import copy_tree
 from distutils.dir_util import DistutilsFileError
+import re
 
 try:
     # non-default python3 module, be helpful if it is missing
@@ -590,7 +591,9 @@
 
     # Open file for writing and update toml
     with open(LIBRARY_VERSIONS_FP, 'w') as f:
-        toml.dump(library_versions, f, encoder=toml.TomlPreserveInlineDictEncoder())
+        versions_toml_file_string = toml.dumps(library_versions, encoder=toml.TomlPreserveInlineDictEncoder())
+        versions_toml_file_string_new = re.sub(",]", " ]", versions_toml_file_string)
+        f.write(versions_toml_file_string_new)
 
 
 def is_group_id_atomic(group_id):
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/development/update_tracing_perfetto.py b/development/update_tracing_perfetto.py
index 333ca7b..2cca0fd 100755
--- a/development/update_tracing_perfetto.py
+++ b/development/update_tracing_perfetto.py
@@ -96,6 +96,7 @@
     # build new binaries
     subprocess.check_call(["./gradlew",
                            ":tracing:tracing-perfetto-binary:createProjectZip",
+                           "-Pandroidx.constraints=true",
                            "-DTRACING_PERFETTO_REUSE_PREBUILTS_AAR=false"],
                           cwd=core_path)
 
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 1ace70c..36bbd84 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -8,16 +8,16 @@
 }
 
 dependencies {
-    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.activity:activity:1.8.0-alpha01")
+    docs("androidx.activity:activity-compose:1.8.0-alpha01")
+    samples("androidx.activity:activity-compose-samples:1.8.0-alpha01")
+    docs("androidx.activity:activity-ktx:1.8.0-alpha01")
     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")
+    docs("androidx.annotation:annotation:1.6.0-rc01")
     docs("androidx.annotation:annotation-experimental:1.3.0")
-    docs("androidx.appcompat:appcompat:1.7.0-alpha01")
-    docs("androidx.appcompat:appcompat-resources:1.7.0-alpha01")
+    docs("androidx.appcompat:appcompat:1.7.0-alpha02")
+    docs("androidx.appcompat:appcompat-resources:1.7.0-alpha02")
     docs("androidx.appsearch:appsearch:1.1.0-alpha02")
     docs("androidx.appsearch:appsearch-builtin-types:1.1.0-alpha02")
     docs("androidx.appsearch:appsearch-ktx:1.1.0-alpha02")
@@ -36,7 +36,7 @@
     docs("androidx.biometric:biometric:1.2.0-alpha05")
     docs("androidx.biometric:biometric-ktx:1.2.0-alpha05")
     samples("androidx.biometric:biometric-ktx-samples:1.2.0-alpha05")
-    docs("androidx.browser:browser:1.5.0-rc01")
+    docs("androidx.browser:browser:1.5.0")
     docs("androidx.camera:camera-camera2:1.3.0-alpha03")
     docs("androidx.camera:camera-core:1.3.0-alpha03")
     docs("androidx.camera:camera-extensions:1.3.0-alpha03")
@@ -54,60 +54,60 @@
     docs("androidx.cardview:cardview:1.0.0")
     docs("androidx.collection:collection:1.3.0-alpha02")
     docs("androidx.collection:collection-ktx:1.3.0-alpha02")
-    docs("androidx.compose.animation:animation:1.4.0-alpha05")
-    docs("androidx.compose.animation:animation-core:1.4.0-alpha05")
-    docs("androidx.compose.animation:animation-graphics:1.4.0-alpha05")
-    samples("androidx.compose.animation:animation-samples:1.4.0-alpha05")
-    samples("androidx.compose.animation:animation-core-samples:1.4.0-alpha05")
-    samples("androidx.compose.animation:animation-graphics-samples:1.4.0-alpha05")
-    docs("androidx.compose.foundation:foundation:1.4.0-alpha05")
-    docs("androidx.compose.foundation:foundation-layout:1.4.0-alpha05")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.4.0-alpha05")
-    samples("androidx.compose.foundation:foundation-samples:1.4.0-alpha05")
-    docs("androidx.compose.material3:material3:1.1.0-alpha05")
-    samples("androidx.compose.material3:material3-samples:1.1.0-alpha05")
-    docs("androidx.compose.material3:material3-window-size-class:1.1.0-alpha05")
-    samples("androidx.compose.material3:material3-window-size-class-samples:1.1.0-alpha05")
-    docs("androidx.compose.material:material:1.4.0-alpha05")
-    docs("androidx.compose.material:material-icons-core:1.4.0-alpha05")
-    samples("androidx.compose.material:material-icons-core-samples:1.4.0-alpha05")
-    docs("androidx.compose.material:material-ripple:1.4.0-alpha05")
-    samples("androidx.compose.material:material-samples:1.4.0-alpha05")
-    docs("androidx.compose.runtime:runtime:1.4.0-alpha05")
-    docs("androidx.compose.runtime:runtime-livedata:1.4.0-alpha05")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.4.0-alpha05")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.4.0-alpha05")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.4.0-alpha05")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.4.0-alpha05")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.4.0-alpha05")
-    docs("androidx.compose.runtime:runtime-saveable:1.4.0-alpha05")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.4.0-alpha05")
-    samples("androidx.compose.runtime:runtime-samples:1.4.0-alpha05")
+    docs("androidx.compose.animation:animation:1.4.0-beta01")
+    docs("androidx.compose.animation:animation-core:1.4.0-beta01")
+    docs("androidx.compose.animation:animation-graphics:1.4.0-beta01")
+    samples("androidx.compose.animation:animation-samples:1.4.0-beta01")
+    samples("androidx.compose.animation:animation-core-samples:1.4.0-beta01")
+    samples("androidx.compose.animation:animation-graphics-samples:1.4.0-beta01")
+    docs("androidx.compose.foundation:foundation:1.4.0-beta01")
+    docs("androidx.compose.foundation:foundation-layout:1.4.0-beta01")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.4.0-beta01")
+    samples("androidx.compose.foundation:foundation-samples:1.4.0-beta01")
+    docs("androidx.compose.material3:material3:1.1.0-alpha06")
+    samples("androidx.compose.material3:material3-samples:1.1.0-alpha06")
+    docs("androidx.compose.material3:material3-window-size-class:1.1.0-alpha06")
+    samples("androidx.compose.material3:material3-window-size-class-samples:1.1.0-alpha06")
+    docs("androidx.compose.material:material:1.4.0-beta01")
+    docs("androidx.compose.material:material-icons-core:1.4.0-beta01")
+    samples("androidx.compose.material:material-icons-core-samples:1.4.0-beta01")
+    docs("androidx.compose.material:material-ripple:1.4.0-beta01")
+    samples("androidx.compose.material:material-samples:1.4.0-beta01")
+    docs("androidx.compose.runtime:runtime:1.4.0-beta01")
+    docs("androidx.compose.runtime:runtime-livedata:1.4.0-beta01")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.4.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.4.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.4.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.4.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.4.0-beta01")
+    docs("androidx.compose.runtime:runtime-saveable:1.4.0-beta01")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.4.0-beta01")
+    samples("androidx.compose.runtime:runtime-samples:1.4.0-beta01")
     docs("androidx.compose.runtime:runtime-tracing:1.0.0-alpha02")
-    docs("androidx.compose.ui:ui:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-geometry:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-graphics:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-graphics-samples:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-test:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-test-junit4:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-test-samples:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-text:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-text-google-fonts:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-text-samples:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-tooling:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-tooling-data:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-tooling-preview:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-unit:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-unit-samples:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-util:1.4.0-alpha05")
-    docs("androidx.compose.ui:ui-viewbinding:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.4.0-alpha05")
-    samples("androidx.compose.ui:ui-samples:1.4.0-alpha05")
+    docs("androidx.compose.ui:ui:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-geometry:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-graphics:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-graphics-samples:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-test:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-test-junit4:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-test-samples:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-text:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-text-google-fonts:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-text-samples:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-tooling:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-data:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-preview:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-unit:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-unit-samples:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-util:1.4.0-beta01")
+    docs("androidx.compose.ui:ui-viewbinding:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.4.0-beta01")
+    samples("androidx.compose.ui:ui-samples:1.4.0-beta01")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
-    docs("androidx.constraintlayout:constraintlayout:2.2.0-alpha06")
-    docs("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha06")
-    docs("androidx.constraintlayout:constraintlayout-core:1.1.0-alpha06")
+    docs("androidx.constraintlayout:constraintlayout:2.2.0-alpha07")
+    docs("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha07")
+    docs("androidx.constraintlayout:constraintlayout-core:1.1.0-alpha07")
     docs("androidx.contentpager:contentpager:1.0.0")
     docs("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
     docs("androidx.core.uwb:uwb:1.0.0-alpha04")
@@ -122,8 +122,9 @@
     docs("androidx.core:core:1.10.0-alpha02")
     docs("androidx.core:core-ktx:1.10.0-alpha02")
     docs("androidx.core:core-splashscreen:1.1.0-alpha01")
-    docs("androidx.credentials:credentials:1.0.0-alpha01")
-    docs("androidx.credentials:credentials-play-services-auth:1.0.0-alpha01")
+    docs("androidx.credentials:credentials:1.0.0-alpha02")
+    docs("androidx.credentials:credentials-play-services-auth:1.0.0-alpha02")
+    docs("androidx.credentials:credentials-provider:1.0.0-alpha02")
     docs("androidx.cursoradapter:cursoradapter:1.0.0")
     docs("androidx.customview:customview:1.2.0-alpha02")
     docs("androidx.customview:customview-poolingcontainer:1.0.0-rc01")
@@ -138,23 +139,23 @@
     docs("androidx.datastore:datastore-rxjava3:1.1.0-alpha01")
     docs("androidx.documentfile:documentfile:1.1.0-alpha01")
     docs("androidx.draganddrop:draganddrop:1.0.0")
-    docs("androidx.drawerlayout:drawerlayout:1.2.0-alpha01")
+    docs("androidx.drawerlayout:drawerlayout:1.2.0-beta01")
     docs("androidx.dynamicanimation:dynamicanimation:1.1.0-alpha02")
     docs("androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03")
-    docs("androidx.emoji2:emoji2:1.3.0-beta01")
-    docs("androidx.emoji2:emoji2-bundled:1.3.0-beta01")
-    docs("androidx.emoji2:emoji2-emojipicker:1.0.0-alpha01")
-    docs("androidx.emoji2:emoji2-views:1.3.0-beta01")
-    docs("androidx.emoji2:emoji2-views-helper:1.3.0-beta01")
+    docs("androidx.emoji2:emoji2:1.3.0-beta02")
+    docs("androidx.emoji2:emoji2-bundled:1.3.0-beta02")
+    docs("androidx.emoji2:emoji2-emojipicker:1.0.0-alpha02")
+    docs("androidx.emoji2:emoji2-views:1.3.0-beta02")
+    docs("androidx.emoji2:emoji2-views-helper:1.3.0-beta02")
     docs("androidx.emoji:emoji:1.2.0-alpha03")
     docs("androidx.emoji:emoji-appcompat:1.2.0-alpha03")
     docs("androidx.emoji:emoji-bundled:1.2.0-alpha03")
     docs("androidx.enterprise:enterprise-feedback:1.1.0")
     docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
-    docs("androidx.exifinterface:exifinterface:1.3.5")
-    docs("androidx.fragment:fragment:1.6.0-alpha04")
-    docs("androidx.fragment:fragment-ktx:1.6.0-alpha04")
-    docs("androidx.fragment:fragment-testing:1.6.0-alpha04")
+    docs("androidx.exifinterface:exifinterface:1.3.6")
+    docs("androidx.fragment:fragment:1.6.0-alpha05")
+    docs("androidx.fragment:fragment-ktx:1.6.0-alpha05")
+    docs("androidx.fragment:fragment-testing:1.6.0-alpha05")
     docs("androidx.glance:glance:1.0.0-alpha05")
     docs("androidx.glance:glance-appwidget:1.0.0-alpha05")
     docs("androidx.glance:glance-appwidget-preview:1.0.0-alpha05")
@@ -210,8 +211,8 @@
     docs("androidx.media2:media2-session:1.2.1")
     docs("androidx.media2:media2-widget:1.2.1")
     docs("androidx.media:media:1.6.0")
-    docs("androidx.mediarouter:mediarouter:1.4.0-beta01")
-    docs("androidx.mediarouter:mediarouter-testing:1.4.0-beta01")
+    docs("androidx.mediarouter:mediarouter:1.6.0-alpha01")
+    docs("androidx.mediarouter:mediarouter-testing:1.6.0-alpha01")
     docs("androidx.metrics:metrics-performance:1.0.0-alpha03")
     docs("androidx.navigation:navigation-common:2.6.0-alpha05")
     docs("androidx.navigation:navigation-common-ktx:2.6.0-alpha05")
@@ -226,18 +227,18 @@
     docs("androidx.navigation:navigation-testing:2.6.0-alpha05")
     docs("androidx.navigation:navigation-ui:2.6.0-alpha05")
     docs("androidx.navigation:navigation-ui-ktx:2.6.0-alpha05")
-    docs("androidx.paging:paging-common:3.2.0-alpha03")
-    docs("androidx.paging:paging-common-ktx:3.2.0-alpha03")
-    docs("androidx.paging:paging-compose:1.0.0-alpha17")
+    docs("androidx.paging:paging-common:3.2.0-alpha04")
+    docs("androidx.paging:paging-common-ktx:3.2.0-alpha04")
+    docs("androidx.paging:paging-compose:1.0.0-alpha18")
     samples("androidx.paging:paging-compose-samples:3.0.0-alpha08")
-    docs("androidx.paging:paging-guava:3.2.0-alpha03")
-    docs("androidx.paging:paging-runtime:3.2.0-alpha03")
-    docs("androidx.paging:paging-runtime-ktx:3.2.0-alpha03")
-    docs("androidx.paging:paging-rxjava2:3.2.0-alpha03")
-    docs("androidx.paging:paging-rxjava2-ktx:3.2.0-alpha03")
-    docs("androidx.paging:paging-rxjava3:3.2.0-alpha03")
-    samples("androidx.paging:paging-samples:3.2.0-alpha03")
-    docs("androidx.paging:paging-testing:3.2.0-alpha03")
+    docs("androidx.paging:paging-guava:3.2.0-alpha04")
+    docs("androidx.paging:paging-runtime:3.2.0-alpha04")
+    docs("androidx.paging:paging-runtime-ktx:3.2.0-alpha04")
+    docs("androidx.paging:paging-rxjava2:3.2.0-alpha04")
+    docs("androidx.paging:paging-rxjava2-ktx:3.2.0-alpha04")
+    docs("androidx.paging:paging-rxjava3:3.2.0-alpha04")
+    samples("androidx.paging:paging-samples:3.2.0-alpha04")
+    docs("androidx.paging:paging-testing:3.2.0-alpha04")
     docs("androidx.palette:palette:1.0.0")
     docs("androidx.palette:palette-ktx:1.0.0")
     docs("androidx.percentlayout:percentlayout:1.0.1")
@@ -248,7 +249,7 @@
     docs("androidx.privacysandbox.tools:tools-apigenerator:1.0.0-alpha02")
     docs("androidx.privacysandbox.tools:tools-apipackager:1.0.0-alpha02")
     docs("androidx.privacysandbox.tools:tools-core:1.0.0-alpha02")
-    docs("androidx.profileinstaller:profileinstaller:1.3.0-alpha03")
+    docs("androidx.profileinstaller:profileinstaller:1.3.0-beta01")
     docs("androidx.recommendation:recommendation:1.0.0")
     docs("androidx.recyclerview:recyclerview:1.3.0-rc01")
     docs("androidx.recyclerview:recyclerview-selection:2.0.0-alpha01")
@@ -308,12 +309,13 @@
     docs("androidx.textclassifier:textclassifier:1.0.0-alpha04")
     docs("androidx.tracing:tracing:1.2.0-alpha02")
     docs("androidx.tracing:tracing-ktx:1.2.0-alpha02")
-    docs("androidx.tracing:tracing-perfetto:1.0.0-alpha09")
-    docs("androidx.tracing:tracing-perfetto-common:1.0.0-alpha09")
+    docs("androidx.tracing:tracing-perfetto:1.0.0-alpha10")
+    docs("androidx.tracing:tracing-perfetto-common:1.0.0-alpha10")
     docs("androidx.transition:transition:1.4.1")
     docs("androidx.transition:transition-ktx:1.4.1")
-    docs("androidx.tv:tv-foundation:1.0.0-alpha03")
-    docs("androidx.tv:tv-material:1.0.0-alpha03")
+    docs("androidx.tv:tv-foundation:1.0.0-alpha04")
+    docs("androidx.tv:tv-material:1.0.0-alpha04")
+    samples("androidx.tv:tv-samples:1.0.0-alpha04")
     docs("androidx.tvprovider:tvprovider:1.1.0-alpha01")
     docs("androidx.vectordrawable:vectordrawable:1.2.0-beta01")
     docs("androidx.vectordrawable:vectordrawable-animated:1.2.0-alpha01")
@@ -321,19 +323,19 @@
     docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
     docs("androidx.viewpager2:viewpager2:1.1.0-beta01")
     docs("androidx.viewpager:viewpager:1.1.0-alpha01")
-    docs("androidx.wear.compose:compose-foundation:1.2.0-alpha03")
-    samples("androidx.wear.compose:compose-foundation-samples:1.2.0-alpha03")
-    docs("androidx.wear.compose:compose-material:1.2.0-alpha03")
-    docs("androidx.wear.compose:compose-material-core:1.2.0-alpha03")
-    samples("androidx.wear.compose:compose-material-samples:1.2.0-alpha03")
+    docs("androidx.wear.compose:compose-foundation:1.2.0-alpha04")
+    samples("androidx.wear.compose:compose-foundation-samples:1.2.0-alpha04")
+    docs("androidx.wear.compose:compose-material:1.2.0-alpha04")
+    docs("androidx.wear.compose:compose-material-core:1.2.0-alpha04")
+    samples("androidx.wear.compose:compose-material-samples:1.2.0-alpha04")
     docs("androidx.wear.compose:compose-material3:1.0.0-alpha01")
-    samples("androidx.wear.compose:compose-material3-samples:1.2.0-alpha03")
-    docs("androidx.wear.compose:compose-navigation:1.2.0-alpha03")
-    samples("androidx.wear.compose:compose-navigation-samples:1.2.0-alpha03")
-    docs("androidx.wear.protolayout:protolayout:1.0.0-alpha02")
-    docs("androidx.wear.protolayout:protolayout-expression:1.0.0-alpha02")
-    docs("androidx.wear.protolayout:protolayout-proto:1.0.0-alpha02")
-    docs("androidx.wear.protolayout:protolayout-renderer:1.0.0-alpha02")
+    samples("androidx.wear.compose:compose-material3-samples:1.2.0-alpha04")
+    docs("androidx.wear.compose:compose-navigation:1.2.0-alpha04")
+    samples("androidx.wear.compose:compose-navigation-samples:1.2.0-alpha04")
+    docs("androidx.wear.protolayout:protolayout:1.0.0-alpha03")
+    docs("androidx.wear.protolayout:protolayout-expression:1.0.0-alpha03")
+    docs("androidx.wear.protolayout:protolayout-proto:1.0.0-alpha03")
+    docs("androidx.wear.protolayout:protolayout-renderer:1.0.0-alpha03")
     docs("androidx.wear.tiles:tiles:1.1.0")
     docs("androidx.wear.tiles:tiles-material:1.1.0")
     docs("androidx.wear.tiles:tiles-proto:1.1.0")
@@ -363,7 +365,7 @@
     docs("androidx.wear:wear-input:1.2.0-alpha02")
     samples("androidx.wear:wear-input-samples:1.2.0-alpha01")
     docs("androidx.wear:wear-input-testing:1.2.0-alpha02")
-    docs("androidx.webkit:webkit:1.7.0-alpha01")
+    docs("androidx.webkit:webkit:1.7.0-alpha02")
     docs("androidx.window:window:1.1.0-alpha04")
     stubs(fileTree(dir: "../window/stubs/", include: ["window-sidecar-release-0.1.0-alpha01.aar"]))
     docs("androidx.window:window-core:1.1.0-alpha04")
@@ -372,11 +374,11 @@
     docs("androidx.window:window-rxjava2:1.1.0-alpha04")
     docs("androidx.window:window-rxjava3:1.1.0-alpha04")
     docs("androidx.window:window-testing:1.1.0-alpha04")
-    docs("androidx.work:work-gcm:2.8.0-rc01")
-    docs("androidx.work:work-multiprocess:2.8.0-rc01")
-    docs("androidx.work:work-runtime:2.8.0-rc01")
-    docs("androidx.work:work-runtime-ktx:2.8.0-rc01")
-    docs("androidx.work:work-rxjava2:2.8.0-rc01")
-    docs("androidx.work:work-rxjava3:2.8.0-rc01")
-    docs("androidx.work:work-testing:2.8.0-rc01")
+    docs("androidx.work:work-gcm:2.8.0")
+    docs("androidx.work:work-multiprocess:2.8.0")
+    docs("androidx.work:work-runtime:2.8.0")
+    docs("androidx.work:work-runtime-ktx:2.8.0")
+    docs("androidx.work:work-rxjava2:2.8.0")
+    docs("androidx.work:work-rxjava3:2.8.0")
+    docs("androidx.work:work-testing:2.8.0")
 }
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/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-bundled/api/1.3.0-beta03.txt b/emoji2/emoji2-bundled/api/1.3.0-beta03.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/1.3.0-beta03.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/public_plus_experimental_1.3.0-beta03.txt b/emoji2/emoji2-bundled/api/public_plus_experimental_1.3.0-beta03.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/public_plus_experimental_1.3.0-beta03.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/res-1.3.0-beta03.txt b/emoji2/emoji2-bundled/api/res-1.3.0-beta03.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/res-1.3.0-beta03.txt
diff --git a/emoji2/emoji2-bundled/api/restricted_1.3.0-beta03.txt b/emoji2/emoji2-bundled/api/restricted_1.3.0-beta03.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/restricted_1.3.0-beta03.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-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/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
index 843d8d2..66f3bef 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
@@ -68,19 +68,19 @@
                         onEmojiPickedListener(emojiViewItem)
                     },
                     onEmojiPickedFromPopupListener = { emoji ->
-                        with(
-                            emojiPickerItemsProvider().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)
                             }
                         }
                     })
             }
-
-            ItemType.PLACEHOLDER_EMOJI -> object : ViewHolder(View(context)) {}
         }
 
     override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
@@ -97,8 +97,6 @@
             ItemType.EMOJI -> {
                 (viewHolder as EmojiViewHolder).bindEmoji((item as EmojiViewData).emoji)
             }
-
-            ItemType.PLACEHOLDER_EMOJI -> {}
         }
     }
 
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..7ac2aa6 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
@@ -24,8 +24,7 @@
  * [titleItem] comes first.
  * [contentItems] comes after [titleItem].
  * [emptyPlaceholderItem] will be served after [titleItem] only if [contentItems] is empty.
- * [forceContentSize], if provided, will truncate [contentItems] to certain size or pad with
- * [PlaceholderEmoji]s.
+ * [maxContentItemCount], if provided, will truncate [contentItems] to certain size.
  *
  * [categoryIconId] is the corresponding category icon in emoji picker header.
  */
@@ -33,24 +32,27 @@
     @DrawableRes internal val categoryIconId: Int,
     internal val titleItem: CategoryTitle,
     private val contentItems: List<EmojiViewData>,
-    private val forceContentSize: Int? = null,
+    private val maxContentItemCount: Int? = null,
     private val emptyPlaceholderItem: PlaceholderText? = null
 ) {
 
     val size: Int
-        get() = 1 /* title */ +
-            (forceContentSize ?: maxOf(
-                contentItems.size,
-                if (emptyPlaceholderItem != null) 1 else 0
-            ))
+        get() = 1 /* title */ + when {
+            contentItems.isEmpty() -> if (emptyPlaceholderItem != null) 1 else 0
+            maxContentItemCount != null && contentItems.size > maxContentItemCount ->
+                maxContentItemCount
+            else -> contentItems.size
+        }
 
     operator fun get(index: Int): ItemViewData {
         if (index == 0) return titleItem
         val contentIndex = index - 1
         if (contentIndex < contentItems.size) return contentItems[contentIndex]
         if (contentIndex == 0 && emptyPlaceholderItem != null) return emptyPlaceholderItem
-        return PlaceholderEmoji
+        throw IndexOutOfBoundsException()
     }
+
+    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 93f7bd1..918a7d6 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
@@ -88,6 +88,7 @@
     private val scope = CoroutineScope(EmptyCoroutineContext)
 
     private var recentEmojiProvider: RecentEmojiProvider = DefaultRecentEmojiProvider(context)
+    private var recentNeedsRefreshing: Boolean = true
     private val recentItems: MutableList<EmojiViewData> = mutableListOf()
     private lateinit var recentItemGroup: ItemGroup
 
@@ -132,7 +133,7 @@
         }
         scope.launch(Dispatchers.IO) {
             val load = launch { BundledEmojiListLoader.load(context) }
-            refreshRecentItems()
+            refreshRecent()
             load.join()
 
             withContext(Dispatchers.Main) {
@@ -150,11 +151,8 @@
             emojiPickerItemsProvider = { emojiPickerItems },
             onEmojiPickedListener = { emojiViewItem ->
                 onEmojiPickedListener?.accept(emojiViewItem)
-
-                scope.launch {
-                    recentEmojiProvider.recordSelection(emojiViewItem.emoji)
-                    refreshRecentItems()
-                }
+                recentEmojiProvider.recordSelection(emojiViewItem.emoji)
+                recentNeedsRefreshing = true
             }
         )
     }
@@ -164,19 +162,19 @@
             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,
+            maxContentItemCount = 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()) {
+        for ((i, category) in BundledEmojiListLoader.getCategorizedEmojiData().withIndex()) {
             add(
                 ItemGroup(
-                    headerIconId,
-                    CategoryTitle(name),
-                    emojis.map {
-                        EmojiViewData(stickyVariantProvider[it.emoji])
+                    category.headerIconId,
+                    CategoryTitle(category.categoryName),
+                    category.emojiDataList.mapIndexed { j, emojiData ->
+                        EmojiViewData(stickyVariantProvider[emojiData.emoji], dataIndex = i + j)
                     },
                 )
             )
@@ -194,19 +192,24 @@
         ).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.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
@@ -238,10 +241,18 @@
                 addOnScrollListener(object : RecyclerView.OnScrollListener() {
                     override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                         super.onScrolled(recyclerView, dx, dy)
-                        val position =
-                            bodyLayoutManager.findFirstCompletelyVisibleItemPosition()
                         headerAdapter.selectedGroupIndex =
-                            emojiPickerItems.groupIndexByItemPosition(position)
+                            emojiPickerItems.groupIndexByItemPosition(
+                                bodyLayoutManager.findFirstCompletelyVisibleItemPosition()
+                            )
+                        if (recentNeedsRefreshing &&
+                            bodyLayoutManager.findFirstVisibleItemPosition() !in
+                            emojiPickerItems.groupRange(recentItemGroup)
+                        ) {
+                            scope.launch {
+                                refreshRecent()
+                            }
+                        }
                     }
                 })
                 // Disable item insertion/deletion animation. This keeps view holder unchanged when
@@ -257,15 +268,40 @@
         }
     }
 
-    private suspend fun refreshRecentItems() {
+    internal suspend fun refreshRecent() {
+        if (!recentNeedsRefreshing) {
+            return
+        }
+        val oldGroupSize = if (::recentItemGroup.isInitialized) recentItemGroup.size else 0
         val recent = recentEmojiProvider.getRecentEmojiList()
-        recentItems.clear()
-        recentItems.addAll(recent.map {
-            EmojiViewData(
-                it,
-                updateToSticky = false,
-            )
-        })
+        withContext(Dispatchers.Main) {
+            recentItems.clear()
+            recentItems.addAll(recent.map {
+                EmojiViewData(
+                    it,
+                    updateToSticky = false,
+                )
+            })
+            if (::emojiPickerItems.isInitialized) {
+                val range = emojiPickerItems.groupRange(recentItemGroup)
+                if (recentItemGroup.size > oldGroupSize) {
+                    bodyAdapter.notifyItemRangeInserted(
+                        range.first + oldGroupSize,
+                        recentItemGroup.size - oldGroupSize
+                    )
+                } else if (recentItemGroup.size < oldGroupSize) {
+                    bodyAdapter.notifyItemRangeRemoved(
+                        range.first + recentItemGroup.size,
+                        oldGroupSize - recentItemGroup.size
+                    )
+                }
+                bodyAdapter.notifyItemRangeChanged(
+                    range.first,
+                    minOf(oldGroupSize, recentItemGroup.size)
+                )
+                recentNeedsRefreshing = false
+            }
+        }
     }
 
     /**
@@ -278,15 +314,9 @@
 
     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)
-                }
-            }
+            recentNeedsRefreshing = true
+            refreshRecent()
         }
     }
 
@@ -397,4 +427,4 @@
     override fun removeViewsInLayout(start: Int, count: Int) {
         throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE)
     }
-}
+}
\ No newline at end of file
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 4007a02..73a1549 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
@@ -20,38 +20,35 @@
     CATEGORY_TITLE,
     PLACEHOLDER_TEXT,
     EMOJI,
-    PLACEHOLDER_EMOJI,
 }
 
 /**
  * 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 data 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 data 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 data class EmojiViewData(
     var emoji: String,
-    val updateToSticky: Boolean = true
+    val updateToSticky: Boolean = true,
+    // Needed to ensure uniqueness since we enabled stable Id.
+    val dataIndex: Int = 0
 ) : ItemViewData(ItemType.EMOJI)
 
-internal object PlaceholderEmoji : ItemViewData(ItemType.PLACEHOLDER_EMOJI)
-
 internal object Extensions {
     internal fun Int.toItemType() = ItemType.values()[this]
 }
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 3e5f5a8..9762e78 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
@@ -61,7 +61,7 @@
      */
     internal fun isEmojiRenderable(emoji: String) =
         if (EmojiPickerView.emojiCompatLoaded)
-            EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) > 0
+            EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) == EmojiCompat.EMOJI_SUPPORTED
         else getClosestRenderable(emoji) != null
 
     // Yawning face is added in emoji 12 which is the first version starts to support gender
diff --git a/emoji2/emoji2-emojipicker/src/main/res/drawable/ripple_emoji_view.xml b/emoji2/emoji2-emojipicker/src/main/res/drawable/ripple_emoji_view.xml
index 3bae1dd..3b05870 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/drawable/ripple_emoji_view.xml
+++ b/emoji2/emoji2-emojipicker/src/main/res/drawable/ripple_emoji_view.xml
@@ -15,7 +15,7 @@
   -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:colorControlHighlight">
+    android:color="?attr/colorAccent">
     <item android:id="@android:id/mask">
         <shape android:shape="rectangle">
             <corners android:radius="12dp" />
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_activity.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_activity.csv
index 2df9810..ff009b3 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_activity.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_activity.csv
@@ -34,8 +34,8 @@
 🏐
 🏈
 🏉
-🎾
 🥅
+🎾
 🏸
 🥍
 🏏
@@ -94,6 +94,8 @@
 🎻
 🪘
 🥁
+🪇
+🪈
 🪗
 🎤
 🎧
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_animals_nature.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_animals_nature.csv
index d66c14b..c88986d 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_animals_nature.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_animals_nature.csv
@@ -7,6 +7,7 @@
 🌸
 💮
 🏵️
+🪻
 🌻
 🌼
 🍂
@@ -23,53 +24,61 @@
 🌴
 🌳
 🌲
+🪵
 🪹
 🪺
-🪵
 🪨
 ⛰️
 🏔️
 ❄️
 ☃️

-🌊
-🫧
-🌬️
-🌀
-🌪️
-🌁
 🌫️
 🌡️
 🔥
 🌋
 🏜️
 🏞️
+🏝️
 🏖️
-⛱️
 🌅
 🌄
-☀️
-🌤️
-⛅
-🌥️
-🌦️
-☁️
-🌨️
-⛈️
-🌩️
-🌧️
-💧
-☔
-⚡
 🌈
+🫧
+🌊
+🌬️
+🌀
+🌪️
+⚡
+☔
+💧
+🌧️
+🌩️
+⛈️
+🌨️
+☁️
+🌦️
+🌥️
+⛅
+🌤️
+☀️
+🌞
+🌝
+🌚
+🌜
+🌛

 🌟
-💫

+💫
 🌙
 ☄️
+🕳️
 🌠
 🌌
+🌍
+🌎
+🌏
 🪐
 🌑
 🌒
@@ -79,9 +88,6 @@
 🌖
 🌗
 🌘
-🌍
-🌎
-🌏
 🙈
 🙉
 🙊
@@ -107,7 +113,7 @@
 🦓
 🦄
 🐴
-🐸
+🫎
 🐲
 🦎
 🐉
@@ -116,19 +122,19 @@
 🐢
 🐊
 🐍
+🐸
+🐇
 🐁
 🐀
-🐇
 🐈
 🐈‍⬛
 🐩
 🐕
 🦮
 🐕‍🦺
-🐅
-🐆
-🐎
 🐖
+🐎
+🫏
 🐄
 🐂
 🐃
@@ -145,6 +151,8 @@
 🦏
 🦛
 🦒
+🐆
+🐅
 🐒
 🦍
 🦧
@@ -157,23 +165,26 @@
 🦔
 🦦
 🦇
+🪽
 🪶
-🦅
-🦉
+🐦
+🐦‍⬛
 🐓
 🐔
 🐣
 🐤
 🐥
-🐦
+🦅
+🦉
 🦜
 🕊️
 🦤
 🦢
+🦆
+🪿
 🦩
 🦚
 🦃
-🦆
 🐧
 🦭
 🦈
@@ -188,6 +199,7 @@
 🦀
 🦑
 🐙
+🪼
 🦪
 🪸
 🦂
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_emotions.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_emotions.csv
index 0a1fcd4..0a5d0d4 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_emotions.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_emotions.csv
@@ -16,24 +16,33 @@
 😍
 🤩
 🥳
+🫠
 🙃
 🙂
 🥲
 🥹
+😊
+☺️
+😌
+😏
+😴
+😪
+🤤
 😋
 😛
 😝
 😜
 🤪
-😇
-😊
-☺️
-😏
-😌
+🥴
 😔
+🥺
+😬
+🫥
 😑
 😐
 😶
+😶‍🌫️
+🤐
 🫡
 🤔
 🤫
@@ -52,7 +61,8 @@
 😠
 😡
 🤬
-🥺
+😞
+😓
 😟
 😥
 😢
@@ -60,7 +70,6 @@
 🙁
 🫤
 😕
-🤐
 😰
 😨
 😧
@@ -70,66 +79,57 @@
 😲
 😳
 🤯
-😬
-😓
-😞
 😖
 😣
 😩
 😫
 😵
 😵‍💫
-🫥
-😴
-😪
-🤤
-🌛
-🌜
-🌚
-🌝
-🌞
-🫠
-😶‍🌫️
-🥴
-🥵
+🫨
 🥶
+🥵
 🤢
 🤮
 🤧
 🤒
 🤕
 😷
+🤥
+😇
 🤠
 🤑
-😎
 🤓
+😎
 🥸
-🤥
 🤡
-👻
-💩
-👽
-🤖
-🎃
 😈
 👿
+👻
+🎃
+💩
+🤖
+👽
+👾
+🌛
+🌜
+🌚
+🌝
+🌞
+☠️
 👹
 👺
 🔥
+💯
 💫

 🌟

 💥
-💯
-💢
 💨
 💦
-🫧
 💤
 🕳️
 🎉
-🎊
 🙈
 🙉
 🙊
@@ -146,12 +146,14 @@
 🧡
 💛
 💚
+🩵
 💙
 💜
 🤎
 🖤
+🩶
 🤍
-♥️
+🩷
 💘
 💝
 💖
@@ -161,6 +163,7 @@
 💕
 💌
 💟
+♥️
 ❣️
 ❤️‍🩹
 💔
@@ -178,7 +181,6 @@
 🦠
 🦷
 🦴
-☠️
 💀
 👀
 👁️
@@ -193,9 +195,9 @@
 🦿
 🦾
 💪,💪,💪🏻,💪🏼,💪🏽,💪🏾,💪🏿
+👏,👏,👏🏻,👏🏼,👏🏽,👏🏾,👏🏿
 👍,👍,👍🏻,👍🏼,👍🏽,👍🏾,👍🏿
 👎,👎,👎🏻,👎🏼,👎🏽,👎🏾,👎🏿
-👏,👏,👏🏻,👏🏼,👏🏽,👏🏾,👏🏿
 🫶,🫶,🫶🏻,🫶🏼,🫶🏽,🫶🏾,🫶🏿
 🙌,🙌,🙌🏻,🙌🏼,🙌🏽,🙌🏾,🙌🏿
 👐,👐,👐🏻,👐🏼,👐🏽,👐🏾,👐🏿
@@ -209,8 +211,10 @@
 🫴,🫴,🫴🏻,🫴🏼,🫴🏽,🫴🏾,🫴🏿
 🫱,🫱,🫱🏻,🫱🏼,🫱🏽,🫱🏾,🫱🏿
 🫲,🫲,🫲🏻,🫲🏼,🫲🏽,🫲🏾,🫲🏿
-🤚,🤚,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏿
+🫸,🫸,🫸🏻,🫸🏼,🫸🏽,🫸🏾,🫸🏿
+🫷,🫷,🫷🏻,🫷🏼,🫷🏽,🫷🏾,🫷🏿
 👋,👋,👋🏻,👋🏼,👋🏽,👋🏾,👋🏿
+🤚,🤚,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏿
 🖐️,🖐️,🖐🏻,🖐🏼,🖐🏽,🖐🏾,🖐🏿
 ✋,✋,✋🏻,✋🏼,✋🏽,✋🏾,✋🏿
 🖖,🖖,🖖🏻,🖖🏼,🖖🏽,🖖🏾,🖖🏿
@@ -223,13 +227,13 @@
 🤌,🤌,🤌🏻,🤌🏼,🤌🏽,🤌🏾,🤌🏿
 🤏,🤏,🤏🏻,🤏🏼,🤏🏽,🤏🏾,🤏🏿
 👌,👌,👌🏻,👌🏼,👌🏽,👌🏾,👌🏿
-🖕,🖕,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏿
+🫵,🫵,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏿
+👉,👉,👉🏻,👉🏼,👉🏽,👉🏾,👉🏿
+👈,👈,👈🏻,👈🏼,👈🏽,👈🏾,👈🏿
 ☝️,☝️,☝🏻,☝🏼,☝🏽,☝🏾,☝🏿
 👆,👆,👆🏻,👆🏼,👆🏽,👆🏾,👆🏿
 👇,👇,👇🏻,👇🏼,👇🏽,👇🏾,👇🏿
-👉,👉,👉🏻,👉🏼,👉🏽,👉🏾,👉🏿
-👈,👈,👈🏻,👈🏼,👈🏽,👈🏾,👈🏿
-🫵,🫵,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏿
+🖕,🖕,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏿
 ✍️,✍️,✍🏻,✍🏼,✍🏽,✍🏾,✍🏿
 🤳,🤳,🤳🏻,🤳🏼,🤳🏽,🤳🏾,🤳🏿
 🙏,🙏,🙏🏻,🙏🏼,🙏🏽,🙏🏾,🙏🏿
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_food_drink.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_food_drink.csv
index 0afc9c8..59e6561 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_food_drink.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_food_drink.csv
@@ -18,6 +18,7 @@
 🥥
 🍅
 🌶️
+🫚
 🥕
 🍠
 🧅
@@ -25,6 +26,7 @@
 🥦
 🥒
 🥬
+🫛
 🫑
 🥑
 🍆
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_objects.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_objects.csv
index 80437da..fd77bf0 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_objects.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_objects.csv
@@ -55,6 +55,7 @@
 🧼
 🪥
 🪒
+🪮
 🧺
 🧦
 🧤
@@ -81,6 +82,7 @@
 👒
 🧢
 👑
+🪭
 🎒
 👝
 👛
@@ -100,20 +102,20 @@
 👡
 👢
 🥾
-👓
-🕶️
 🦯
+🕶️
+👓
 🥽
 ⚗️
 🧫
 🧪
 🌡️
-🧬
 💉
 💊
 🩹
 🩺
 🩻
+🧬
 🔭
 🔬
 📡
@@ -141,10 +143,6 @@
 🖇️
 📏
 📐
-✂️
-📌
-📍
-🗑️
 🖌️
 🖍️
 🖊️
@@ -152,6 +150,8 @@
 ✒️
 ✏️
 📝
+📖
+📚
 📒
 📔
 📕
@@ -159,27 +159,28 @@
 📗
 📘
 📙
-📚
-📖
 🔖
 🗒️
 📄
 📃
 📋
-📇
 📑
-🗃️
-🗄️
-🗂️
 📂
 📁
-📰
-🗞️
+🗂️
+🗃️
+🗄️
 📊
 📈
 📉
-🪧
+📇
 🪪
+📌
+📍
+✂️
+🗑️
+📰
+🗞️
 🏷️
 📦
 📫
@@ -195,7 +196,6 @@
 📤
 📥
 🗳️
-⏱️
 🕛
 🕧
 🕐
@@ -220,15 +220,17 @@
 🕥
 🕚
 🕦
+⏱️
+⌚
+🕰️


-🕰️
-⌚
 ⏲️

-🗓️
 📅
 📆
+🗓️
+🪧
 🛎️
 🔔
 📯
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_symbols.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_symbols.csv
index 26d7459..34789a03 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_symbols.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_symbols.csv
@@ -1,12 +1,3 @@
-❤️
-🧡
-💛
-💚
-💙
-💜
-🤎
-🖤
-🤍
 🔴
 🟠
 🟡
@@ -25,6 +16,22 @@
 🟫


+❤️
+🧡
+💛
+💚
+💙
+💜
+🤎
+🖤
+🤍
+🩷
+🩵
+🩶
+♥️
+♦️
+♣️
+♠️



@@ -41,8 +48,10 @@
 ♀️
 ♂️
 ⚧️
-🔻
-🔺
+💭
+🗯️
+💬
+🗨️



@@ -71,6 +80,9 @@

 📛
 ♨️
+💢
+🔻
+🔺
 🉐
 ㊙️
 ㊗️
@@ -84,11 +96,11 @@
 🈸
 🈺
 🈷️
+✴️
 🔶
 🔸
 🔆
 🔅
-✴️
 🆚
 🎦
 📶
@@ -111,6 +123,7 @@
 ⏺️
 ⏏️
 📴
+🛜
 📳
 📲
 🔈
@@ -215,6 +228,7 @@
 ☮️
 ☯️
 ☪️
+🪯
 ✝️
 ☦️
 ✡️
@@ -234,10 +248,6 @@
 ©️
 ®️
 ™️
-♥️
-♦️
-♣️
-♠️
 🔘
 🔳
 ◼️
@@ -247,8 +257,4 @@
 ◻️

 ▫️
-💭
-🗯️
-💬
-🗨️
 👁️‍🗨️
diff --git a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_travel_places.csv b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_travel_places.csv
index 5e95477..8704e95 100644
--- a/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_travel_places.csv
+++ b/emoji2/emoji2-emojipicker/src/main/res/raw/emoji_category_travel_places.csv
@@ -106,6 +106,7 @@
 🛖

 🏕️
+⛱️
 🏙️
 🌆
 🌇
@@ -114,7 +115,6 @@
 🌁
 🛤️
 🛣️
-🏝️
 🗾
 🗺️
 🌐
diff --git a/emoji2/emoji2-views-helper/api/1.3.0-beta03.txt b/emoji2/emoji2-views-helper/api/1.3.0-beta03.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/1.3.0-beta03.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/public_plus_experimental_1.3.0-beta03.txt b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.3.0-beta03.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.3.0-beta03.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/res-1.3.0-beta03.txt b/emoji2/emoji2-views-helper/api/res-1.3.0-beta03.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/res-1.3.0-beta03.txt
diff --git a/emoji2/emoji2-views-helper/api/restricted_1.3.0-beta03.txt b/emoji2/emoji2-views-helper/api/restricted_1.3.0-beta03.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/restricted_1.3.0-beta03.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/1.3.0-beta03.txt b/emoji2/emoji2-views/api/1.3.0-beta03.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/1.3.0-beta03.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/public_plus_experimental_1.3.0-beta03.txt b/emoji2/emoji2-views/api/public_plus_experimental_1.3.0-beta03.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/public_plus_experimental_1.3.0-beta03.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/res-1.3.0-beta03.txt b/emoji2/emoji2-views/api/res-1.3.0-beta03.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji2/emoji2-views/api/res-1.3.0-beta03.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji2/emoji2-views/api/restricted_1.3.0-beta03.txt b/emoji2/emoji2-views/api/restricted_1.3.0-beta03.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/restricted_1.3.0-beta03.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/1.3.0-beta03.txt b/emoji2/emoji2/api/1.3.0-beta03.txt
new file mode 100644
index 0000000..11d9335
--- /dev/null
+++ b/emoji2/emoji2/api/1.3.0-beta03.txt
@@ -0,0 +1,131 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiEnd(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiStart(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setSpanFactory(androidx.emoji2.text.EmojiCompat.SpanFactory);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public static interface EmojiCompat.SpanFactory {
+    method @RequiresApi(19) public androidx.emoji2.text.EmojiSpan createSpan(androidx.emoji2.text.TypefaceEmojiRasterizer);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+    method public final androidx.emoji2.text.TypefaceEmojiRasterizer getTypefaceRasterizer();
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+  @AnyThread @RequiresApi(19) public class TypefaceEmojiRasterizer {
+    method public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
+    method public int getCodepointAt(int);
+    method public int getCodepointsLength();
+    method public int getHeight();
+    method public android.graphics.Typeface getTypeface();
+    method public int getWidth();
+    method public boolean isDefaultEmoji();
+    method public boolean isPreferredSystemRender();
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/public_plus_experimental_1.3.0-beta03.txt b/emoji2/emoji2/api/public_plus_experimental_1.3.0-beta03.txt
new file mode 100644
index 0000000..11d9335
--- /dev/null
+++ b/emoji2/emoji2/api/public_plus_experimental_1.3.0-beta03.txt
@@ -0,0 +1,131 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiEnd(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiStart(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setSpanFactory(androidx.emoji2.text.EmojiCompat.SpanFactory);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public static interface EmojiCompat.SpanFactory {
+    method @RequiresApi(19) public androidx.emoji2.text.EmojiSpan createSpan(androidx.emoji2.text.TypefaceEmojiRasterizer);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+    method public final androidx.emoji2.text.TypefaceEmojiRasterizer getTypefaceRasterizer();
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+  @AnyThread @RequiresApi(19) public class TypefaceEmojiRasterizer {
+    method public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
+    method public int getCodepointAt(int);
+    method public int getCodepointsLength();
+    method public int getHeight();
+    method public android.graphics.Typeface getTypeface();
+    method public int getWidth();
+    method public boolean isDefaultEmoji();
+    method public boolean isPreferredSystemRender();
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/res-1.3.0-beta03.txt b/emoji2/emoji2/api/res-1.3.0-beta03.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2/api/res-1.3.0-beta03.txt
diff --git a/emoji2/emoji2/api/restricted_1.3.0-beta03.txt b/emoji2/emoji2/api/restricted_1.3.0-beta03.txt
new file mode 100644
index 0000000..11d9335
--- /dev/null
+++ b/emoji2/emoji2/api/restricted_1.3.0-beta03.txt
@@ -0,0 +1,131 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiEnd(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getEmojiStart(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setSpanFactory(androidx.emoji2.text.EmojiCompat.SpanFactory);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public static interface EmojiCompat.SpanFactory {
+    method @RequiresApi(19) public androidx.emoji2.text.EmojiSpan createSpan(androidx.emoji2.text.TypefaceEmojiRasterizer);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+    method public final androidx.emoji2.text.TypefaceEmojiRasterizer getTypefaceRasterizer();
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+  @AnyThread @RequiresApi(19) public class TypefaceEmojiRasterizer {
+    method public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
+    method public int getCodepointAt(int);
+    method public int getCodepointsLength();
+    method public int getHeight();
+    method public android.graphics.Typeface getTypeface();
+    method public int getWidth();
+    method public boolean isDefaultEmoji();
+    method public boolean isPreferredSystemRender();
+  }
+
+}
+
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/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 7db804e..cb5b014 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -456,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/build.gradle b/fragment/fragment/build.gradle
index b751358..63b13fb 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -34,6 +34,7 @@
     api("androidx.lifecycle:lifecycle-livedata-core:2.5.1")
     api(projectOrArtifact(":lifecycle:lifecycle-viewmodel"))
     api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
     api("androidx.savedstate:savedstate:1.2.0")
     api("androidx.annotation:annotation-experimental:1.0.0")
     api(libs.kotlinStdlib)
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt
index 68082e6..8dacb98 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt
@@ -19,6 +19,9 @@
 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
@@ -290,4 +293,46 @@
             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/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
deleted file mode 100644
index 60c277f..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
-    public 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 24827f0..c84669f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -223,7 +223,8 @@
         void onBackStackChanged();
 
         /**
-         * Called whenever the contents of the back stack are starting to be changed.
+         * 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
@@ -1893,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++) {
@@ -1944,15 +1957,9 @@
                 // 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 (int i = 0; i < mBackStackChangeListeners.size(); i++) {
-                            mBackStackChangeListeners.get(i).onBackStackChangeStarted(fragment,
-                                    isPop);
-                        }
                         // Then we give them all the committed signal
-                        for (int i = 0; i < mBackStackChangeListeners.size(); i++) {
-                            mBackStackChangeListeners.get(i).onBackStackChangeCommitted(fragment,
-                                    isPop);
+                        for (OnBackStackChangedListener listener : mBackStackChangeListeners) {
+                            listener.onBackStackChangeCommitted(fragment, isPop);
                         }
                     }
                 }
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.kt b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
index 2ab3a26..ec638b2 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
@@ -22,6 +22,7 @@
 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
@@ -164,7 +165,7 @@
             updateFinalState()
             val lastEnteringFragment = pendingOperations.lastOrNull { operation ->
                 // Only consider operations with entering transitions
-                val currentState = Operation.State.from(operation.fragment.mView)
+                val currentState = operation.fragment.mView.asOperationState()
                 operation.finalState == Operation.State.VISIBLE &&
                     currentState != Operation.State.VISIBLE
             }?.fragment
@@ -433,18 +434,12 @@
             companion object {
                 /**
                  * Create a new State from the [view's visibility][View.getVisibility].
-                 *
-                 * @param view The view to get the current visibility from.
-                 * @return A new State from the view's visibility.
                  */
-                @JvmStatic
-                fun from(view: View): State {
+                fun View.asOperationState() = if (alpha == 0f && visibility == View.VISIBLE) {
                     // We should consider views with an alpha of 0 as INVISIBLE.
-                    return if (view.alpha == 0f && view.visibility == View.VISIBLE) {
-                        INVISIBLE
-                    } else {
-                        from(view.visibility)
-                    }
+                    INVISIBLE
+                } else {
+                    from(visibility)
                 }
 
                 /**
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..fbdf3cf 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);
   }
@@ -31,6 +19,7 @@
 
   public final class CheckBoxKt {
     method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors();
@@ -50,22 +39,14 @@
     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();
-    method public androidx.glance.session.SessionManager? getSessionManager();
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public void Content();
     method public androidx.glance.appwidget.SizeMode getSizeMode();
     method public androidx.glance.state.GlanceStateDefinition<?>? getStateDefinition();
     method public suspend Object? onDelete(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public androidx.glance.session.SessionManager? sessionManager;
+    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
   }
@@ -83,10 +64,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
-    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 {
+    method public suspend <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> Object? requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback, optional kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
@@ -100,30 +78,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();
@@ -137,18 +100,13 @@
 
   public final class RadioButtonKt {
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, androidx.glance.action.Action? onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.RadioButtonColors radioButtonColors();
     method public static androidx.glance.GlanceModifier selectableGroup(androidx.glance.GlanceModifier);
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -171,16 +129,11 @@
 
   public final class SwitchKt {
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors(androidx.glance.unit.ColorProvider checkedThumbColor, androidx.glance.unit.ColorProvider uncheckedThumbColor, androidx.glance.unit.ColorProvider checkedTrackColor, androidx.glance.unit.ColorProvider uncheckedTrackColor);
     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 +142,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,13 +257,10 @@
     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();
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void TemplateContent();
+    method public final suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<?>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
     field public static final androidx.glance.appwidget.template.GlanceTemplateAppWidget.Companion Companion;
@@ -335,44 +279,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..041c8e4 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);
   }
@@ -31,6 +19,7 @@
 
   public final class CheckBoxKt {
     method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors();
@@ -50,25 +39,17 @@
     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();
-    method public androidx.glance.session.SessionManager? getSessionManager();
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public void Content();
     method public androidx.glance.appwidget.SizeMode getSizeMode();
     method public androidx.glance.state.GlanceStateDefinition<?>? getStateDefinition();
     method public suspend Object? onDelete(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public androidx.glance.session.SessionManager? sessionManager;
+    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
   }
@@ -86,10 +67,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
-    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 {
+    method public suspend <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> Object? requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback, optional kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
@@ -103,35 +81,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();
@@ -145,6 +108,7 @@
 
   public final class RadioButtonKt {
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, androidx.glance.action.Action? onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.RadioButtonColors radioButtonColors();
@@ -157,12 +121,6 @@
     property public final android.widget.RemoteViews remoteViews;
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -185,16 +143,11 @@
 
   public final class SwitchKt {
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors(androidx.glance.unit.ColorProvider checkedThumbColor, androidx.glance.unit.ColorProvider uncheckedThumbColor, androidx.glance.unit.ColorProvider checkedTrackColor, androidx.glance.unit.ColorProvider uncheckedTrackColor);
     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 +156,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,13 +271,10 @@
     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();
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void TemplateContent();
+    method public final suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<?>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
     field public static final androidx.glance.appwidget.template.GlanceTemplateAppWidget.Companion Companion;
@@ -349,44 +293,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..fbdf3cf 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);
   }
@@ -31,6 +19,7 @@
 
   public final class CheckBoxKt {
     method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.CheckBoxColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.CheckBoxColors checkBoxColors();
@@ -50,22 +39,14 @@
     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();
-    method public androidx.glance.session.SessionManager? getSessionManager();
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public void Content();
     method public androidx.glance.appwidget.SizeMode getSizeMode();
     method public androidx.glance.state.GlanceStateDefinition<?>? getStateDefinition();
     method public suspend Object? onDelete(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId glanceId, kotlin.coroutines.Continuation<? super kotlin.Unit>);
-    property public androidx.glance.session.SessionManager? sessionManager;
+    method public final suspend Object? update(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
   }
@@ -83,10 +64,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
-    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 {
+    method public suspend <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> Object? requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback, optional kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
@@ -100,30 +78,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();
@@ -137,18 +100,13 @@
 
   public final class RadioButtonKt {
     method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, androidx.glance.action.Action? onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.RadioButtonColors colors, optional int maxLines);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(androidx.glance.unit.ColorProvider checkedColor, androidx.glance.unit.ColorProvider uncheckedColor);
     method public static androidx.glance.appwidget.RadioButtonColors radioButtonColors(long checkedColor, long uncheckedColor);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.RadioButtonColors radioButtonColors();
     method public static androidx.glance.GlanceModifier selectableGroup(androidx.glance.GlanceModifier);
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -171,16 +129,11 @@
 
   public final class SwitchKt {
     method @androidx.compose.runtime.Composable public static void Switch(boolean checked, androidx.glance.action.Action? onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function0<kotlin.Unit> onCheckedChange, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? style, optional androidx.glance.appwidget.SwitchColors colors, optional int maxLines);
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors(androidx.glance.unit.ColorProvider checkedThumbColor, androidx.glance.unit.ColorProvider uncheckedThumbColor, androidx.glance.unit.ColorProvider checkedTrackColor, androidx.glance.unit.ColorProvider uncheckedTrackColor);
     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 +142,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,13 +257,10 @@
     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();
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void TemplateContent();
+    method public final suspend Object? provideGlance(android.content.Context context, androidx.glance.GlanceId id, kotlin.coroutines.Continuation<?>);
     property public androidx.glance.appwidget.SizeMode sizeMode;
     property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
     field public static final androidx.glance.appwidget.template.GlanceTemplateAppWidget.Companion Companion;
@@ -335,44 +279,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/demos/src/main/java/androidx/glance/appwidget/demos/ActionAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ActionAppWidget.kt
index 8cfbfc5..13498e5 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ActionAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ActionAppWidget.kt
@@ -28,11 +28,14 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.datastore.preferences.core.intPreferencesKey
 import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.LocalContext
@@ -41,19 +44,15 @@
 import androidx.glance.action.actionParametersOf
 import androidx.glance.action.actionStartActivity
 import androidx.glance.action.clickable
-import androidx.glance.action.toParametersKey
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.actionRunCallback
 import androidx.glance.appwidget.action.actionSendBroadcast
 import androidx.glance.appwidget.action.actionStartActivity
 import androidx.glance.appwidget.action.actionStartService
 import androidx.glance.appwidget.appWidgetBackground
 import androidx.glance.appwidget.cornerRadius
-import androidx.glance.appwidget.state.updateAppWidgetState
+import androidx.glance.appwidget.provideContent
 import androidx.glance.color.ColorProvider
-import androidx.glance.currentState
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Column
 import androidx.glance.layout.ColumnScope
@@ -70,36 +69,46 @@
 
 class ActionAppWidget : GlanceAppWidget() {
 
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId,
+    ) = provideContent {
         Column(
             modifier = GlanceModifier.padding(R.dimen.external_padding).fillMaxSize()
                 .appWidgetBackground().cornerRadius(R.dimen.corner_radius),
             verticalAlignment = Alignment.Vertical.CenterVertically,
             horizontalAlignment = Alignment.Horizontal.CenterHorizontally
         ) {
-            Row(GlanceModifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
-                SelectableActionItem(label = "Activities", index = 0)
-                SelectableActionItem(label = "Services", index = 1)
-                SelectableActionItem(label = "Broadcasts", index = 2)
+            val pages = listOf("Activities", "Services", "Broadcasts")
+            var currentPage by remember { mutableStateOf(pages.first()) }
+            Row(
+                modifier = GlanceModifier.fillMaxWidth(),
+                horizontalAlignment = Alignment.CenterHorizontally
+            ) {
+                for (page in pages) {
+                    SelectableActionItem(
+                        label = page,
+                        active = page == currentPage,
+                        onClick = { currentPage = page },
+                    )
+                }
             }
 
-            when (currentState(SelectedItemKey) ?: 0) {
-                0 -> StartActivityActions()
-                1 -> StartServiceActions()
-                2 -> SendBroadcastActions()
-                else -> throw IllegalArgumentException("Wrong index selected")
+            when (currentPage) {
+                "Activities" -> StartActivityActions()
+                "Services" -> StartServiceActions()
+                "Broadcasts" -> SendBroadcastActions()
+                else -> throw IllegalArgumentException("Unknown page")
             }
         }
     }
 }
 
-private val SelectedItemKey = intPreferencesKey("selectedItemKey")
 private val StartMessageKey = ActionParameters.Key<String>("launchMessageKey")
 
 @Composable
-private fun SelectableActionItem(label: String, index: Int) {
-    val style = if (index == (currentState(SelectedItemKey) ?: 0)) {
+private fun SelectableActionItem(label: String, active: Boolean, onClick: () -> Unit) {
+    val style = if (active) {
         TextStyle(
             fontSize = 16.sp,
             fontWeight = FontWeight.Bold,
@@ -119,15 +128,7 @@
     Text(
         text = label,
         style = style,
-        modifier = GlanceModifier
-            .padding(8.dp)
-            .clickable(
-                actionRunCallback<UpdateAction>(
-                    actionParametersOf(
-                        SelectedItemKey.toParametersKey() to index
-                    )
-                )
-            )
+        modifier = GlanceModifier.padding(8.dp).clickable(onClick)
     )
 }
 
@@ -234,22 +235,6 @@
 }
 
 /**
- * Action to update the [SelectedItemKey] value whenever users clicks on text
- */
-class UpdateAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        updateAppWidgetState(context, glanceId) { state ->
-            state[SelectedItemKey] = parameters[SelectedItemKey.toParametersKey()] ?: 0
-        }
-        ActionAppWidget().update(context, glanceId)
-    }
-}
-
-/**
  * Placeholder activity to launch via [actionStartActivity]
  */
 class ActionDemoActivity : ComponentActivity() {
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
index c469cba..e6fbcbf 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
@@ -17,42 +17,37 @@
 package androidx.glance.appwidget.demos
 
 import android.content.Context
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.datastore.preferences.core.Preferences
-import androidx.datastore.preferences.core.booleanPreferencesKey
 import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
-import androidx.glance.action.ActionParameters
-import androidx.glance.action.actionParametersOf
 import androidx.glance.appwidget.CheckBox
-import androidx.glance.appwidget.checkBoxColors
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.RadioButton
-import androidx.glance.appwidget.radioButtonColors
 import androidx.glance.appwidget.SizeMode
 import androidx.glance.appwidget.Switch
-import androidx.glance.appwidget.switchColors
-import androidx.glance.appwidget.selectableGroup
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.ToggleableStateKey
-import androidx.glance.appwidget.action.actionRunCallback
 import androidx.glance.appwidget.appWidgetBackground
+import androidx.glance.appwidget.checkBoxColors
 import androidx.glance.appwidget.cornerRadius
-import androidx.glance.appwidget.state.updateAppWidgetState
+import androidx.glance.appwidget.radioButtonColors
+import androidx.glance.appwidget.selectableGroup
+import androidx.glance.appwidget.provideContent
+import androidx.glance.appwidget.switchColors
 import androidx.glance.background
 import androidx.glance.color.ColorProvider
-import androidx.glance.currentState
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Column
 import androidx.glance.layout.Row
 import androidx.glance.layout.fillMaxSize
 import androidx.glance.layout.fillMaxWidth
-import androidx.glance.layout.padding
 import androidx.glance.layout.height
+import androidx.glance.layout.padding
 import androidx.glance.text.FontStyle
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextStyle
@@ -61,18 +56,10 @@
 
     override val sizeMode: SizeMode = SizeMode.Exact
 
-    enum class Buttons {
-        CHECK_1, CHECK_2, CHECK_3, SWITCH_1, SWITCH_2, RADIO_1, RADIO_2, RADIO_3;
-        val prefsKey = booleanPreferencesKey(name)
-    }
-
-    enum class Radios {
-        RADIO_1, RADIO_2, RADIO_3;
-        val prefsKey = booleanPreferencesKey(name)
-    }
-
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId,
+    ) = provideContent {
         Column(
             modifier = GlanceModifier.fillMaxSize().background(Color.LightGray)
                 .padding(R.dimen.external_padding).cornerRadius(R.dimen.corner_radius)
@@ -88,29 +75,22 @@
             )
             val fillModifier = GlanceModifier.fillMaxWidth()
 
-            val prefs = currentState<Preferences>()
-            val checkbox1Checked = prefs[Buttons.CHECK_1.prefsKey] ?: false
-            val checkbox2Checked = prefs[Buttons.CHECK_2.prefsKey] ?: false
-            val checkbox3Checked = prefs[Buttons.CHECK_3.prefsKey] ?: false
-            val switch1Checked = prefs[Buttons.SWITCH_1.prefsKey] ?: false
-            val switch2Checked = prefs[Buttons.SWITCH_2.prefsKey] ?: false
-            val radio1Checked = prefs[Buttons.RADIO_1.prefsKey] ?: false
-            val radio2Checked = prefs[Buttons.RADIO_2.prefsKey] ?: false
-            val radio3Checked = prefs[Buttons.RADIO_3.prefsKey] ?: false
+            var checkbox1Checked by remember { mutableStateOf(false) }
+            var checkbox2Checked by remember { mutableStateOf(false) }
+            var checkbox3Checked by remember { mutableStateOf(false) }
+            var switch1Checked by remember { mutableStateOf(false) }
+            var switch2Checked by remember { mutableStateOf(false) }
+            var radioChecked by remember { mutableStateOf(0) }
 
             CheckBox(
                 checked = checkbox1Checked,
-                onCheckedChange = actionRunCallback<ToggleAction>(
-                    actionParametersOf(EventTargetKey to Buttons.CHECK_1.name)
-                ),
+                onCheckedChange = { checkbox1Checked = !checkbox1Checked },
                 text = "Checkbox 1",
                 modifier = GlanceModifier.height(56.dp).padding(bottom = 24.dp),
             )
             CheckBox(
                 checked = checkbox2Checked,
-                onCheckedChange = actionRunCallback<ToggleAction>(
-                    actionParametersOf(EventTargetKey to Buttons.CHECK_2.name)
-                ),
+                onCheckedChange = { checkbox2Checked = !checkbox2Checked },
                 text = "Checkbox 2",
                 style = textStyle,
                 modifier = fillModifier,
@@ -121,16 +101,12 @@
             )
             CheckBox(
                 checked = checkbox3Checked,
-                onCheckedChange = actionRunCallback<ToggleAction>(
-                    actionParametersOf(EventTargetKey to Buttons.CHECK_3.name)
-                ),
+                onCheckedChange = { checkbox3Checked = !checkbox2Checked },
                 text = "Checkbox 3",
             )
             Switch(
                 checked = switch1Checked,
-                onCheckedChange = actionRunCallback<ToggleAction>(
-                    actionParametersOf(EventTargetKey to Buttons.SWITCH_1.name)
-                ),
+                onCheckedChange = { switch1Checked = !switch1Checked },
                 text = "Switch 1",
                 colors = switchColors(
                     checkedThumbColor = ColorProvider(day = Color.Red, night = Color.Cyan),
@@ -141,19 +117,15 @@
             )
             Switch(
                 checked = switch2Checked,
-                onCheckedChange = actionRunCallback<ToggleAction>(
-                    actionParametersOf(EventTargetKey to Buttons.SWITCH_2.name)
-                ),
+                onCheckedChange = { switch2Checked = !switch2Checked },
                 text = "Switch 2",
                 style = textStyle,
                 modifier = fillModifier
             )
             Column(modifier = fillModifier.selectableGroup()) {
                 RadioButton(
-                    checked = radio1Checked,
-                    onClick = actionRunCallback<RadioAction>(
-                        actionParametersOf(EventTargetKey to Radios.RADIO_1.name)
-                    ),
+                    checked = radioChecked == 0,
+                    onClick = { radioChecked = 0 },
                     text = "Radio 1",
                     colors = radioButtonColors(
                         checkedColor = ColorProvider(day = Color.Red, night = Color.Cyan),
@@ -161,10 +133,8 @@
                     ),
                 )
                 RadioButton(
-                    checked = radio2Checked,
-                    onClick = actionRunCallback<RadioAction>(
-                        actionParametersOf(EventTargetKey to Radios.RADIO_2.name)
-                    ),
+                    checked = radioChecked == 1,
+                    onClick = { radioChecked = 1 },
                     text = "Radio 2",
                     colors = radioButtonColors(
                         checkedColor = ColorProvider(day = Color.Cyan, night = Color.Yellow),
@@ -172,26 +142,24 @@
                     ),
                 )
                 RadioButton(
-                    checked = radio3Checked,
-                    onClick = actionRunCallback<RadioAction>(
-                        actionParametersOf(EventTargetKey to Radios.RADIO_3.name)
-                    ),
+                    checked = radioChecked == 2,
+                    onClick = { radioChecked = 2 },
                     text = "Radio 3",
                 )
             }
             Row(modifier = fillModifier.selectableGroup()) {
                 RadioButton(
-                    checked = radio1Checked,
+                    checked = radioChecked == 0,
                     onClick = null,
                     text = "Radio 1",
                 )
                 RadioButton(
-                    checked = radio2Checked,
+                    checked = radioChecked == 1,
                     onClick = null,
                     text = "Radio 2",
                 )
                 RadioButton(
-                    checked = radio3Checked,
+                    checked = radioChecked == 2,
                     onClick = null,
                     text = "Radio 3",
                 )
@@ -200,45 +168,6 @@
     }
 }
 
-class ToggleAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters,
-    ) {
-        val target = requireNotNull(parameters[EventTargetKey]) {
-            "Add event target to parameters in order to update the view state."
-        }.let { CompoundButtonAppWidget.Buttons.valueOf(it) }
-        val checked = requireNotNull(parameters[ToggleableStateKey]) {
-            "This action should only be called in response to toggleable events"
-        }
-
-        updateAppWidgetState(context, glanceId) { state ->
-            state[target.prefsKey] = checked
-        }
-        CompoundButtonAppWidget().update(context, glanceId)
-    }
-}
-
-private val EventTargetKey = ActionParameters.Key<String>("EventTarget")
-
-class RadioAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters,
-    ) {
-        val target = requireNotNull(parameters[EventTargetKey]) {
-            "Add event target to parameters in order to update the view state."
-        }.let { CompoundButtonAppWidget.Radios.valueOf(it) }
-
-        updateAppWidgetState(context, glanceId) { state ->
-            CompoundButtonAppWidget.Radios.values().forEach { state[it.prefsKey] = it == target }
-        }
-        CompoundButtonAppWidget().update(context, glanceId)
-    }
-}
-
 class CompoundButtonAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget = CompoundButtonAppWidget()
 }
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultColorsAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultColorsAppWidget.kt
index 56bb8f4..4a49342 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultColorsAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultColorsAppWidget.kt
@@ -22,20 +22,22 @@
 import androidx.compose.material3.darkColorScheme
 import androidx.compose.material3.lightColorScheme
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import androidx.glance.Button
 import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.GlanceTheme
-import androidx.glance.action.ActionParameters
 import androidx.glance.appwidget.CheckBox
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.RadioButton
 import androidx.glance.appwidget.Switch
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.actionRunCallback
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.layout.Column
 import androidx.glance.layout.Row
@@ -50,18 +52,21 @@
  * A demo showing how to construct a widget with [GlanceTheme]. It will use Material 3 colors and
  * when supported, it will use the dynamic color theme.
  */
-class DefaultColorsAppWidget(private val theme: DemoColorScheme.Scheme) : GlanceAppWidget() {
-
-    @Composable
-    override fun Content() {
-        val colors = when (theme) {
-            DemoColorScheme.Scheme.SystemM3 -> GlanceTheme.colors
-            DemoColorScheme.Scheme.CustomM3 -> ColorProviders(
+class DefaultColorsAppWidget : GlanceAppWidget() {
+    enum class Scheme { SystemM3, CustomM3, CustomM2 }
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
+        var currentScheme by remember { mutableStateOf(Scheme.SystemM3) }
+        val colors = when (currentScheme) {
+            Scheme.SystemM3 -> GlanceTheme.colors
+            Scheme.CustomM3 -> ColorProviders(
                 light = DemoColorScheme.LightColors,
                 dark = DemoColorScheme.DarkColors
             )
 
-            DemoColorScheme.Scheme.CustomM2 -> ColorProviders(
+            Scheme.CustomM2 -> ColorProviders(
                 light = DemoColorScheme.SampleM2ColorsLight,
                 dark = DemoColorScheme.SampleM2ColorsDark
             )
@@ -75,12 +80,26 @@
             ) {
                 Button(
                     text = "Theme: $currentScheme",
-                    onClick = actionRunCallback<ChangeThemeCallback>(),
+                    onClick = {
+                        currentScheme = when (currentScheme) {
+                            Scheme.SystemM3 -> Scheme.CustomM3
+                            Scheme.CustomM3 -> Scheme.CustomM2
+                            Scheme.CustomM2 -> Scheme.SystemM3
+                        }
+                    },
                     modifier = GlanceModifier.padding(2.dp)
                 )
                 Row(GlanceModifier.padding(top = 8.dp)) {
-                    CheckBox(checked = false, onCheckedChange = doNothingAction, text = "Unchecked")
-                    CheckBox(checked = true, onCheckedChange = doNothingAction, text = "Checked")
+                    CheckBox(
+                        checked = false,
+                        onCheckedChange = doNothingAction,
+                        text = "Unchecked"
+                    )
+                    CheckBox(
+                        checked = true,
+                        onCheckedChange = doNothingAction,
+                        text = "Checked"
+                    )
                 }
 
                 Row(modifier = GlanceModifier.padding(bottom = 8.dp)) {
@@ -108,9 +127,9 @@
     )
     Column {
         with(GlanceTheme.colors) {
-            // Using  nested column because Glance uses statically generated layouts. Our Rows/Columns
-            // can only support a fixed number of children, so nesting is a workaround. The usual perf
-            // caveats for nested views still apply.
+            // Using  nested column because Glance uses statically generated layouts. Our
+            // Rows/Columns can only support a fixed number of children, so nesting is a workaround.
+            // The usual perf caveats for nested views still apply.
             Column(modifier = GlanceModifier.background(Color.Transparent)) {
                 Text(text = "Primary / OnPrimary", fg = onPrimary, bg = primary)
                 Text(
@@ -152,30 +171,14 @@
 
 private val doNothingAction = null
 
-class ChangeThemeCallback : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        colorSchemeIndex = (colorSchemeIndex + 1) % DemoColorScheme.Scheme.values().size
-        DefaultColorsAppWidget(currentScheme).update(context, glanceId)
-    }
-}
-
-private var colorSchemeIndex = 0
-private val currentScheme: DemoColorScheme.Scheme
-    get() = DemoColorScheme.Scheme.values()[colorSchemeIndex]
-
 class DefaultColorsAppWidgetReceiver : GlanceAppWidgetReceiver() {
-    override val glanceAppWidget = DefaultColorsAppWidget(currentScheme)
+    override val glanceAppWidget = DefaultColorsAppWidget()
 }
 
 /**
  * Color scheme generated using https://m3.material.io/theme-builder#/custom
  */
 object DemoColorScheme {
-    enum class Scheme { SystemM3, CustomM3, CustomM2 }
 
     val md_theme_light_primary = Color(0xFF026E00)
     val md_theme_light_onPrimary = Color(0xFFFFFFFF)
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultStateAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultStateAppWidget.kt
index 360c3de..fe9dbc3 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultStateAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/DefaultStateAppWidget.kt
@@ -36,6 +36,7 @@
 class DefaultStateAppWidget : GlanceAppWidget() {
 
     @Composable
+    @Deprecated("")
     override fun Content() {
         // Get the current stored value for the given Key.
         val count = currentState(CountClicksKey) ?: 0
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ErrorUiAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ErrorUiAppWidget.kt
index 68ec3b5..bb69260 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ErrorUiAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ErrorUiAppWidget.kt
@@ -16,16 +16,18 @@
 
 package androidx.glance.appwidget.demos
 
-import androidx.compose.runtime.Composable
+import android.content.Context
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.LocalSize
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
 import androidx.glance.appwidget.background
+import androidx.glance.appwidget.provideContent
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Box
 import androidx.glance.layout.Column
@@ -42,8 +44,10 @@
 class ErrorUiAppWidget : GlanceAppWidget() {
     override val sizeMode: SizeMode = SizeMode.Exact
 
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         val size = LocalSize.current
         Column(
             modifier = GlanceModifier.fillMaxSize()
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
index d257a49..9f4b92c 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
@@ -16,16 +16,17 @@
 
 package androidx.glance.appwidget.demos
 
-import androidx.compose.runtime.Composable
+import android.content.Context
 import androidx.compose.ui.graphics.Color
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
-import androidx.glance.LocalContext
 import androidx.glance.LocalSize
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
 import androidx.glance.appwidget.background
 import androidx.glance.appwidget.cornerRadius
+import androidx.glance.appwidget.provideContent
 import androidx.glance.color.ColorProvider
 import androidx.glance.layout.Column
 import androidx.glance.layout.fillMaxSize
@@ -39,9 +40,10 @@
 class ExactAppWidget : GlanceAppWidget() {
     override val sizeMode: SizeMode = SizeMode.Exact
 
-    @Composable
-    override fun Content() {
-        val context = LocalContext.current
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         Column(
             modifier = GlanceModifier
                 .fillMaxSize()
@@ -62,6 +64,9 @@
             val width = dec.format(size.width.value)
             val height = dec.format(size.height.value)
             Text("Current layout: ${width}dp x ${height}dp")
+            for (i in 0 until 20) {
+                Text("Text $i")
+            }
         }
     }
 }
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ImageAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ImageAppWidget.kt
index 1d16188..fddee1b 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ImageAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ImageAppWidget.kt
@@ -16,6 +16,7 @@
 
 package androidx.glance.appwidget.demos
 
+import android.content.Context
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -25,6 +26,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.glance.Button
 import androidx.glance.ColorFilter
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.Image
 import androidx.glance.ImageProvider
@@ -32,6 +34,7 @@
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.color.ColorProvider
 import androidx.glance.layout.Alignment
@@ -43,19 +46,18 @@
 import androidx.glance.layout.fillMaxWidth
 import androidx.glance.layout.padding
 import androidx.glance.layout.size
-import androidx.glance.session.GlanceSessionManager
 import androidx.glance.text.Text
 
 /**
  * Sample AppWidget that showcase the [ContentScale] options for [Image]
  */
 class ImageAppWidget : GlanceAppWidget() {
-
     override val sizeMode: SizeMode = SizeMode.Exact
-    override val sessionManager = GlanceSessionManager
 
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         var type by remember { mutableStateOf(ContentScale.Fit) }
         Column(modifier = GlanceModifier.fillMaxSize().padding(8.dp)) {
             Header()
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ProgressIndicatorAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ProgressIndicatorAppWidget.kt
index 2613fb0..3f5283a 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ProgressIndicatorAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ProgressIndicatorAppWidget.kt
@@ -16,14 +16,16 @@
 
 package androidx.glance.appwidget.demos
 
-import androidx.compose.runtime.Composable
+import android.content.Context
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.CircularProgressIndicator
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.LinearProgressIndicator
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Column
@@ -34,11 +36,13 @@
 import androidx.glance.unit.ColorProvider
 
 class ProgressIndicatorAppWidget : GlanceAppWidget() {
-
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         Column(
-            modifier = GlanceModifier.fillMaxSize().background(R.color.default_widget_background),
+            modifier = GlanceModifier.fillMaxSize()
+                .background(R.color.default_widget_background),
             verticalAlignment = Alignment.CenterVertically,
             horizontalAlignment = Alignment.CenterHorizontally
         ) {
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
index 9be215f..b801043 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
@@ -16,13 +16,18 @@
 
 package androidx.glance.appwidget.demos
 
-import androidx.compose.runtime.Composable
+import android.content.Context
+import android.util.Log
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
+import androidx.glance.ImageProvider
+import androidx.glance.action.clickable
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.layout.Column
 import androidx.glance.layout.Row
@@ -36,28 +41,24 @@
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
 
-import androidx.glance.action.clickable
-import androidx.glance.ImageProvider
-import android.content.Context
-import androidx.glance.appwidget.action.actionRunCallback
-import androidx.glance.GlanceId
-import androidx.glance.action.ActionParameters
-import androidx.glance.appwidget.action.ActionCallback
-
 class ResizingAppWidget : GlanceAppWidget() {
 
     override val sizeMode: SizeMode = SizeMode.Single
 
-    @Composable
-    override fun Content() {
-        Column(modifier = GlanceModifier.fillMaxSize().padding(16.dp).background(Color.LightGray)) {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
+        Column(
+            modifier = GlanceModifier.fillMaxSize().padding(16.dp).background(Color.LightGray)
+        ) {
             Row(modifier = GlanceModifier.fillMaxWidth()) {
                 Text(
                     "first",
                     modifier = GlanceModifier
                         .width(50.dp)
                         .background(Color(0xFFBBBBBB))
-                        .clickable(actionRunCallback<NoopAction>()),
+                        .clickable { Log.i("GlanceAppWidget", "first clicked") },
                     style = TextStyle(textAlign = TextAlign.Start)
                 )
                 Text(
@@ -67,14 +68,15 @@
                         textAlign = TextAlign.Center,
                     ),
                     modifier = GlanceModifier.defaultWeight().height(50.dp)
+                        .clickable { Log.i("GlanceAppWidget", "second clicked") },
                 )
                 Text(
                     "third",
                     modifier = GlanceModifier
                         .width(50.dp)
                         .background(Color(0xFFBBBBBB))
-                        .clickable(actionRunCallback<NoopAction>()),
-                    style = TextStyle(textAlign = TextAlign.End)
+                        .clickable { Log.i("GlanceAppWidget", "third clicked") },
+                style = TextStyle(textAlign = TextAlign.End)
                 )
             }
             Text(
@@ -82,7 +84,7 @@
                 modifier = GlanceModifier
                     .defaultWeight()
                     .fillMaxWidth()
-                    .clickable(actionRunCallback<NoopAction>())
+                    .clickable { Log.i("GlanceAppWidget", "middle clicked") }
                     .background(ImageProvider(R.drawable.compose)),
                 style = TextStyle(textAlign = TextAlign.Center)
             )
@@ -119,14 +121,4 @@
 
 class ResizingAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget: GlanceAppWidget = ResizingAppWidget()
-}
-
-class NoopAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        android.util.Log.e("GlanceAppWidget", "Action called")
-    }
 }
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
index a801ca0..cdea0ef 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
@@ -27,14 +27,13 @@
 import androidx.glance.ButtonColors
 import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
+import androidx.glance.LocalContext
 import androidx.glance.LocalSize
 import androidx.glance.action.ActionParameters
-import androidx.glance.action.actionParametersOf
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.actionRunCallback
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Box
@@ -68,8 +67,10 @@
         setOf(SMALL_BOX, BIG_BOX, ROW, LARGE_ROW, COLUMN, LARGE_COLUMN)
     )
 
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         // Content will be called for each of the provided sizes
         when (LocalSize.current) {
             COLUMN -> ResponsiveColumn(numItems = 3)
@@ -79,7 +80,8 @@
             SMALL_BOX -> ResponsiveBox(numItems = 1)
             BIG_BOX -> ResponsiveBox(numItems = 3)
             VERY_BIG_BOX -> ResponsiveBox(numItems = 5)
-            else -> throw IllegalArgumentException("Invalid size not matching the provided ones")
+            else ->
+                throw IllegalArgumentException("Invalid size not matching the provided ones")
         }
     }
 }
@@ -151,6 +153,7 @@
     textStyle: TextStyle? = null
 ) {
     Box(modifier = modifier) {
+        val context = LocalContext.current
         Button(
             text = text,
             modifier = GlanceModifier.fillMaxSize().padding(8.dp).background(color),
@@ -159,31 +162,19 @@
                 contentColor = ColorProvider(Color.White)
             ),
             style = textStyle ?: TextStyle(textAlign = TextAlign.Center),
-            onClick = actionRunCallback<ResponsiveAction>(
-                actionParametersOf(
-                    ItemClickedKey to text
-                )
-            )
+            onClick = {
+                Handler(context.mainLooper).post {
+                    Toast.makeText(
+                        context,
+                        "Item clicked: $text",
+                        Toast.LENGTH_SHORT
+                    ).show()
+                }
+            }
         )
     }
 }
 
-class ResponsiveAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        Handler(context.mainLooper).post {
-            Toast.makeText(
-                context,
-                "Item clicked: ${parameters[ItemClickedKey]}",
-                Toast.LENGTH_SHORT
-            ).show()
-        }
-    }
-}
-
 class ResponsiveAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget: GlanceAppWidget = ResponsiveAppWidget()
 }
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ScrollableAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ScrollableAppWidget.kt
index 71b2300..57c941fa 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ScrollableAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ScrollableAppWidget.kt
@@ -25,34 +25,30 @@
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.datastore.preferences.core.booleanPreferencesKey
 import androidx.glance.Button
 import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.LocalContext
 import androidx.glance.LocalSize
-import androidx.glance.action.ActionParameters
-import androidx.glance.action.actionParametersOf
 import androidx.glance.action.clickable
 import androidx.glance.appwidget.CheckBox
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.ToggleableStateKey
-import androidx.glance.appwidget.action.actionRunCallback
 import androidx.glance.appwidget.action.actionStartActivity
-import androidx.glance.appwidget.demos.ScrollableAppWidget.Companion.CheckboxKey
 import androidx.glance.appwidget.lazy.GridCells
 import androidx.glance.appwidget.lazy.LazyColumn
 import androidx.glance.appwidget.lazy.itemsIndexed
-import androidx.glance.appwidget.state.updateAppWidgetState
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
-import androidx.glance.currentState
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Column
 import androidx.glance.layout.Row
@@ -75,18 +71,19 @@
         private val singleColumn = DpSize(100.dp, 48.dp)
         private val doubleColumn = DpSize(200.dp, 48.dp)
         private val tripleColumn = DpSize(300.dp, 48.dp)
-
-        val CheckboxKey = booleanPreferencesKey("checkbox")
     }
 
     override val sizeMode: SizeMode = SizeMode.Responsive(
         setOf(singleColumn, doubleColumn, tripleColumn)
     )
 
-    @Composable
-    override fun Content() {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
         Column(
-            modifier = GlanceModifier.fillMaxSize().background(R.color.default_widget_background)
+            modifier = GlanceModifier.fillMaxSize()
+                .background(R.color.default_widget_background)
         ) {
             Text(
                 text = "Fix header",
@@ -111,6 +108,7 @@
 
 @Composable
 private fun ScrollColumn(modifier: GlanceModifier) {
+    val context = LocalContext.current
     LazyColumn(modifier) {
         item {
             SectionHeading(
@@ -160,11 +158,15 @@
                 modifier = GlanceModifier
                     .fillMaxWidth()
                     .padding(horizontal = 16.dp, vertical = 8.dp)
-                    .clickable(
-                        actionRunCallback<LogItemClickAction>(
-                            actionParametersOf(ClickedItemKey to index)
-                        )
-                    )
+                    .clickable {
+                        Handler(context.mainLooper).post {
+                            Toast.makeText(
+                                context,
+                                "Click from list item $index",
+                                Toast.LENGTH_SHORT
+                            ).show()
+                        }
+                    }
             )
         }
         item {
@@ -174,9 +176,10 @@
             )
         }
         item {
+            var checked by remember { mutableStateOf(false) }
             CheckBox(
-                checked = currentState(CheckboxKey) ?: false,
-                onCheckedChange = actionRunCallback<ListToggleAction>(),
+                checked = checked,
+                onCheckedChange = { checked = !checked },
                 text = "Checkbox"
             )
         }
@@ -214,38 +217,6 @@
     }
 }
 
-/** Work executed when [ScrollableAppWidget] list's item is clicked. */
-class LogItemClickAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        Handler(context.mainLooper).post {
-            Toast.makeText(
-                context,
-                "Click from list item ${parameters[ClickedItemKey]}",
-                Toast.LENGTH_SHORT
-            ).show()
-        }
-    }
-}
-
-class ListToggleAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        updateAppWidgetState(context, glanceId) { state ->
-            state[CheckboxKey] = parameters[ToggleableStateKey] ?: false
-        }
-        ScrollableAppWidget().update(context, glanceId)
-    }
-}
-
-private val ClickedItemKey = ActionParameters.Key<Int>("ClickedItemKey")
-
 class ScrollableAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget: GlanceAppWidget = ScrollableAppWidget()
 }
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/VerticalGridAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/VerticalGridAppWidget.kt
index c4f2a90..9c4f452 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/VerticalGridAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/VerticalGridAppWidget.kt
@@ -16,11 +16,13 @@
 
 package androidx.glance.appwidget.demos
 
+import android.content.Context
 import android.os.Build
 import android.content.Intent
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.unit.dp
 import androidx.glance.Button
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.LocalContext
 import androidx.glance.appwidget.GlanceAppWidget
@@ -31,6 +33,7 @@
 import androidx.glance.appwidget.lazy.GridCells
 import androidx.glance.appwidget.lazy.LazyVerticalGrid
 import androidx.glance.appwidget.lazy.itemsIndexed
+import androidx.glance.appwidget.provideContent
 import androidx.glance.background
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Row
@@ -41,9 +44,11 @@
 
 class VerticalGridAppWidget : GlanceAppWidget() {
 
-    @Composable
-    override fun Content() {
-        var gridCells = if (Build.VERSION.SDK_INT >= 31) {
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId
+    ) = provideContent {
+        val gridCells = if (Build.VERSION.SDK_INT >= 31) {
             GridCells.Adaptive(100.dp)
         } else {
             GridCells.Fixed(3)
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-target/src/main/java/androidx/glance/appwidget/macrobenchmark/target/BasicAppWidget.kt b/glance/glance-appwidget/integration-tests/macrobenchmark-target/src/main/java/androidx/glance/appwidget/macrobenchmark/target/BasicAppWidget.kt
index b12aaca..e3d1d31 100644
--- a/glance/glance-appwidget/integration-tests/macrobenchmark-target/src/main/java/androidx/glance/appwidget/macrobenchmark/target/BasicAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/macrobenchmark-target/src/main/java/androidx/glance/appwidget/macrobenchmark/target/BasicAppWidget.kt
@@ -16,18 +16,17 @@
 
 package androidx.glance.appwidget.macrobenchmark.target
 
-import androidx.compose.runtime.Composable
-import androidx.datastore.preferences.core.Preferences
+import android.content.Context
+import androidx.glance.GlanceId
 import androidx.glance.GlanceModifier
 import androidx.glance.LocalSize
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
 import androidx.glance.appwidget.Tracing
-import androidx.glance.currentState
+import androidx.glance.appwidget.provideContent
 import androidx.glance.layout.Column
 import androidx.glance.layout.fillMaxSize
-import androidx.glance.session.GlanceSessionManager
 import androidx.glance.text.Text
 import kotlin.math.roundToInt
 
@@ -38,26 +37,23 @@
     }
     override val sizeMode: SizeMode = SizeMode.Single
 
-    @Composable
-    override fun Content() {
-        val size = LocalSize.current
-        // Even though this widget does not use it, accessing state will ensure that this
-        // is recomposed every time state updates, which is useful for testing.
-        currentState<Preferences>()
-        Column(
-            modifier = GlanceModifier.fillMaxSize(),
-        ) {
-            Text(
-                " Current size: ${size.width.value.roundToInt()} dp x " +
-                    "${size.height.value.roundToInt()} dp"
-            )
+    override suspend fun provideGlance(
+        context: Context,
+        id: GlanceId,
+    ) {
+        provideContent {
+            Column(GlanceModifier.fillMaxSize()) {
+                val size = LocalSize.current
+                Text(
+                    " Current size: ${size.width.value.roundToInt()} dp x " +
+                        "${size.height.value.roundToInt()} dp"
+                )
+            }
         }
     }
 }
 
-class BasicAppWidgetWithSession : BasicAppWidget() {
-    override val sessionManager = GlanceSessionManager
-}
+class BasicAppWidgetWithSession : BasicAppWidget()
 
 class BasicAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget: GlanceAppWidget = BasicAppWidget()
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/AppWidgetHostRule.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
index 64bd87c..277f268 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,13 +22,13 @@
 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
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.core.view.children
-import androidx.glance.session.GlanceSessionManager
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.rules.ActivityScenarioRule
@@ -53,7 +53,6 @@
 class AppWidgetHostRule(
     private var mPortraitSize: DpSize = DpSize(200.dp, 300.dp),
     private var mLandscapeSize: DpSize = DpSize(300.dp, 200.dp),
-    private var useSessionManager: Boolean = false,
 ) : TestRule {
 
     val portraitSize: DpSize
@@ -101,8 +100,6 @@
 
         override fun evaluate() {
             WorkManagerTestInitHelper.initializeTestWorkManager(mContext)
-            TestGlanceAppWidget.sessionManager =
-                if (useSessionManager) GlanceSessionManager else null
             mInnerRules.apply(base, description).evaluate()
             stopHost()
         }
@@ -142,6 +139,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 +186,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 8982ac3..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
@@ -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) {
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
index 3f33bc5..ddfd0bfa 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
@@ -23,12 +23,15 @@
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import androidx.test.uiautomator.UiSelector
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.runTest
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SdkSuppress(minSdkVersion = 29)
 @MediumTest
 class GlanceAppWidgetManagerTest {
@@ -85,34 +88,28 @@
     }
 
     @Test
-    fun pinAppWidget() {
+    fun pinAppWidget() = runTest {
         val text = "Something"
         TestGlanceAppWidget.uiDefinition = {
             Text(text)
         }
 
-        mHostRule.onHostActivity { activity ->
-            val manager = GlanceAppWidgetManager(activity)
-
-            val result = manager.requestPinGlanceAppWidget(
-                TestGlanceAppWidgetReceiver::class.java,
-                preview = TestGlanceAppWidget
-            )
-            assertThat(result).isTrue()
+        val result = GlanceAppWidgetManager(context).requestPinGlanceAppWidget(
+            TestGlanceAppWidgetReceiver::class.java,
+            preview = TestGlanceAppWidget
+        )
+        assertThat(result).isTrue()
+        mHostRule.onHostActivity {
             assertThat(mHostRule.device.findObject(UiSelector().text(text)).exists())
         }
     }
 
     @Test
-    fun pinInvalidAppWidget() {
-        mHostRule.onHostActivity { activity ->
-            val manager = GlanceAppWidgetManager(activity)
-
-            val result = manager.requestPinGlanceAppWidget(
-                DummyGlanceAppWidgetReceiver::class.java
-            )
-            assertThat(result).isFalse()
-        }
+    fun pinInvalidAppWidget() = runTest {
+        val result = GlanceAppWidgetManager(context).requestPinGlanceAppWidget(
+            DummyGlanceAppWidgetReceiver::class.java,
+        )
+        assertThat(result).isFalse()
     }
 
     @Test
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 c584330..0dca420 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
@@ -28,6 +28,7 @@
 import android.text.style.UnderlineSpan
 import android.util.Log
 import android.view.View
+import android.view.ViewGroup
 import android.widget.CompoundButton
 import android.widget.FrameLayout
 import android.widget.ImageView
@@ -36,8 +37,10 @@
 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
@@ -103,44 +106,47 @@
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.collectIndexed
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.take
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.test.runTest
+import org.junit.After
 import org.junit.Assert.assertThrows
 import org.junit.Before
 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
-@RunWith(Parameterized::class)
-class GlanceAppWidgetReceiverTest(val useSessionManager: Boolean) {
+class GlanceAppWidgetReceiverTest {
     @get:Rule
-    val mHostRule = AppWidgetHostRule(useSessionManager = useSessionManager)
+    val mHostRule = AppWidgetHostRule()
 
     @get:Rule
     val mViewDumpRule = ViewHierarchyFailureWatcher()
 
     val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
-    companion object {
-        @Parameterized.Parameters(name = "useGlanceSession={0}")
-        @JvmStatic
-        fun data() = mutableListOf(true, false)
-    }
-
     @Before
     fun setUp() {
         // Reset the size mode to the default
         TestGlanceAppWidget.sizeMode = SizeMode.Single
     }
 
+    @After
+    fun cleanUp() {
+        TestGlanceAppWidget.resetOnDeleteBlock()
+    }
+
     @Test
     fun createSimpleAppWidget() {
         TestGlanceAppWidget.uiDefinition = {
@@ -691,7 +697,7 @@
 
         CallbackTest.received.set(emptyList())
         CallbackTest.latch = CountDownLatch(2)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(
                 root.findChild<TextView> { it.text.toString() == "text1" }?.parent as? View
             )
@@ -726,7 +732,7 @@
 
         CallbackTest.received.set(emptyList())
         CallbackTest.latch = CountDownLatch(1)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(
                 root.findChild<TextView> { it.text.toString() == "text1" }?.parent as? View
             )
@@ -773,42 +779,37 @@
     }
 
     @Test
-    fun compoundButtonAction() {
+    fun compoundButtonAction() = runTest {
         val checkbox = "checkbox"
         val switch = "switch"
+        val checkBoxClicked = MutableStateFlow(false)
+        val switchClicked = MutableStateFlow(false)
 
         TestGlanceAppWidget.uiDefinition = {
             Column {
                 CheckBox(
                     checked = false,
-                    onCheckedChange = actionRunCallback<CompoundButtonActionTest>(
-                        actionParametersOf(CompoundButtonActionTest.key to checkbox)
-                    ),
+                    onCheckedChange = { assert(checkBoxClicked.tryEmit(true)) },
                     text = checkbox
                 )
                 Switch(
                     checked = true,
-                    onCheckedChange = actionRunCallback<CompoundButtonActionTest>(
-                        actionParametersOf(CompoundButtonActionTest.key to switch)
-                    ), text = switch
+                    onCheckedChange = { assert(switchClicked.tryEmit(true)) },
+                    text = switch
                 )
             }
         }
 
         mHostRule.startHost()
 
-        CompoundButtonActionTest.received.set(emptyList())
-        CompoundButtonActionTest.latch = CountDownLatch(2)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(root.findChild<TextView> { it.text.toString() == checkbox })
                 .performCompoundButtonClick()
             checkNotNull(root.findChild<TextView> { it.text.toString() == switch })
                 .performCompoundButtonClick()
         }
-        CompoundButtonActionTest.latch.await(5, TimeUnit.SECONDS)
-        assertThat(CompoundButtonActionTest.received.get()).containsExactly(
-            checkbox to true, switch to false
-        )
+        checkBoxClicked.first { it }
+        switchClicked.first { it }
     }
 
     @Test
@@ -867,7 +868,7 @@
 
         CallbackTest.received.set(emptyList())
         CallbackTest.latch = CountDownLatch(1)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<View> { root ->
             checkNotNull(root.findChild<TextView> { it.text.toString() == "text1" })
                 .performCompoundButtonClick()
         }
@@ -877,7 +878,6 @@
 
     @Test
     fun lambdaActionCallback() = runTest {
-        if (!useSessionManager) return@runTest
         TestGlanceAppWidget.uiDefinition = {
             val text = remember { mutableStateOf("initial") }
             Button(
@@ -890,7 +890,7 @@
 
         mHostRule.startHost()
         var button: View? = null
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             val text = checkNotNull(root.findChild<TextView> { it.text.toString() == "initial" })
             button = text.parent as View
         }
@@ -898,44 +898,35 @@
             button!!.performClick()
         }
 
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(root.findChild<TextView> { it.text.toString() == "clicked" })
         }
     }
 
-    @FlakyTest(bugId = 259938473)
     @Test
     fun unsetActionCallback() = runTest {
+        var enabled by mutableStateOf(true)
         TestGlanceAppWidget.uiDefinition = {
-            val enabled = currentState<Preferences>()[testBoolKey] ?: true
             Text(
                 "text1",
-                modifier = if (enabled) {
-                    GlanceModifier.clickable(
-                        actionRunCallback<CallbackTest>(
-                            actionParametersOf(CallbackTest.key to 1)
-                        )
-                    )
-                } else GlanceModifier
+                modifier = if (enabled) GlanceModifier.clickable {} else GlanceModifier
             )
         }
 
         mHostRule.startHost()
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<View> { root ->
             val view =
                 checkNotNull(
                     root.findChild<TextView> { it.text.toString() == "text1" }?.parent as? View
                 )
             assertThat(view.hasOnClickListeners()).isTrue()
         }
-        updateAppWidgetState(context, AppWidgetId(mHostRule.appWidgetId)) {
-            it[testBoolKey] = false
-        }
+
         mHostRule.runAndWaitForUpdate {
-            TestGlanceAppWidget.update(context, AppWidgetId(mHostRule.appWidgetId))
+            enabled = false
         }
 
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<TextView> { root ->
             val view =
                 checkNotNull(
                     root.findChild<TextView> { it.text.toString() == "text1" }?.parent as? View
@@ -963,7 +954,7 @@
 
         CompoundButtonActionTest.received.set(emptyList())
         CompoundButtonActionTest.latch = CountDownLatch(1)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(root.findChild<TextView> { it.text.toString() == "checkbox" })
                 .performCompoundButtonClick()
         }
@@ -981,7 +972,7 @@
 
         CompoundButtonActionTest.received.set(emptyList())
         CompoundButtonActionTest.latch = CountDownLatch(1)
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             checkNotNull(root.findChild<TextView> { it.text.toString() == "checkbox" })
                 .performCompoundButtonClick()
         }
@@ -1009,7 +1000,7 @@
 
         mHostRule.startHost()
 
-        mHostRule.onHostView { root ->
+        mHostRule.onUnboxedHostView<ViewGroup> { root ->
             val checkbox =
                 checkNotNull(root.findChild<CompoundButton> { it.text.toString() == "checkbox" })
             assertThat(checkbox.hasOnClickListeners()).isFalse()
@@ -1070,8 +1061,7 @@
     }
 
     @Test
-        fun cancellingContentCoroutineCausesContentToLeaveComposition() = runBlocking {
-            if (!useSessionManager) return@runBlocking
+    fun cancellingContentCoroutineCausesContentToLeaveComposition() = runBlocking {
         val currentEffectState = MutableStateFlow(EffectState.Initial)
         var contentJob: Job? = null
         TestGlanceAppWidget.onProvideGlance = {
@@ -1124,13 +1114,21 @@
 
     enum class EffectState { Initial, Started, Disposed }
 
-    val logTag: String = "GlanceAppWidgetReceiverTest"
-
     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(logTag, "$description failed")
-            Log.e(logTag, "Host view hierarchy at failure:")
-            logViewHierarchy(logTag, mHostRule.mHostView, "")
+            Log.e(RECEIVER_TEST_TAG, "$description failed")
+            Log.e(RECEIVER_TEST_TAG, "Host view hierarchy at failure:")
+            logViewHierarchy(RECEIVER_TEST_TAG, mHostRule.mHostView, "")
         }
     }
 }
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..a57500f 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
@@ -32,15 +31,23 @@
 import androidx.glance.action.clickable
 import androidx.glance.appwidget.lazy.LazyColumn
 import androidx.glance.appwidget.lazy.ReservedItemIdRangeEnd
+import androidx.glance.appwidget.lazy.items
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.padding
 import androidx.glance.text.Text
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
+import kotlin.test.assertIs
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.FlowPreview
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.debounce
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 import org.junit.Rule
 import org.junit.Test
-import kotlin.test.assertIs
 
 @SdkSuppress(minSdkVersion = 29)
 @MediumTest
@@ -342,6 +349,41 @@
         }
     }
 
+    @OptIn(FlowPreview::class)
+    @Test
+    fun clickTriggersOnlyOneLambda() = runBlocking {
+        val received = MutableStateFlow(-1)
+        TestGlanceAppWidget.uiDefinition = {
+            LazyColumn {
+                items((0..4).toList()) {
+                    Button(
+                        "$it",
+                        onClick = {
+                            launch { received.emit(it) }
+                        }
+                    )
+                }
+            }
+        }
+
+        mHostRule.startHost()
+
+        val buttons = arrayOfNulls<FrameLayout>(5)
+        waitForListViewChildren { list ->
+            for (it in 0..4) {
+                val button = list.getUnboxedListItem<FrameLayout>(it)
+                buttons[it] = assertIs<FrameLayout>(button)
+            }
+        }
+        (0..4).shuffled().forEach { index ->
+            mHostRule.onHostActivity {
+                buttons[index]!!.performClick()
+            }
+            val lastClicked = received.debounce(500.milliseconds).first()
+            assertThat(lastClicked).isEqualTo(index)
+        }
+    }
+
     private fun waitForListViewChildren(action: (list: ListView) -> Unit = {}) {
         mHostRule.onHostView { }
 
@@ -358,6 +400,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..e0865a3 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
@@ -21,7 +21,6 @@
 import android.util.Log
 import androidx.compose.runtime.Composable
 import androidx.glance.GlanceId
-import androidx.glance.session.SessionManager
 
 class TestGlanceAppWidgetReceiver : GlanceAppWidgetReceiver() {
     override val glanceAppWidget: GlanceAppWidget = TestGlanceAppWidget
@@ -30,6 +29,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
@@ -39,15 +42,9 @@
 }
 
 object TestGlanceAppWidget : GlanceAppWidget(errorUiLayout = 0) {
-    override var sessionManager: SessionManager? = null
 
     override var sizeMode: SizeMode = SizeMode.Single
 
-    @Composable
-    override fun Content() {
-        uiDefinition()
-    }
-
     override suspend fun provideGlance(
         context: Context,
         id: GlanceId
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/AppWidgetComposer.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetComposer.kt
new file mode 100644
index 0000000..597ef63
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetComposer.kt
@@ -0,0 +1,123 @@
+/*
+ * 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.glance.appwidget
+
+import android.content.Context
+import android.os.Bundle
+import android.widget.RemoteViews
+import androidx.compose.runtime.BroadcastFrameClock
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Recomposer
+import androidx.compose.ui.unit.DpSize
+import androidx.glance.Applier
+import androidx.glance.GlanceComposable
+import androidx.glance.GlanceId
+import androidx.glance.LocalContext
+import androidx.glance.LocalGlanceId
+import androidx.glance.LocalState
+import androidx.glance.state.ConfigManager
+import androidx.glance.state.GlanceState
+import androidx.glance.state.PreferencesGlanceStateDefinition
+import kotlin.coroutines.coroutineContext
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Run the given [content] composition and translate it to [RemoteViews].
+ */
+internal suspend fun compose(
+    context: Context,
+    id: GlanceId = AppWidgetId(-1),
+    sizeMode: SizeMode = SizeMode.Single,
+    size: DpSize? = null,
+    options: Bundle? = null,
+    state: Any? = null,
+    configManager: ConfigManager = GlanceState,
+    content: @Composable @GlanceComposable () -> Unit,
+): RemoteViews {
+    val appWidgetId = (id as AppWidgetId).appWidgetId
+    val layoutConfig = LayoutConfiguration.load(context, appWidgetId)
+    val glanceState = state ?: configManager.getValue(
+        context,
+        PreferencesGlanceStateDefinition,
+        createUniqueRemoteUiName(appWidgetId)
+    )
+    val manager = context.appWidgetManager
+    val finalOptions = options ?: manager.getAppWidgetOptions(appWidgetId) ?: Bundle()
+    val minSize = appWidgetMinSize(
+        context.resources.displayMetrics,
+        manager,
+        appWidgetId
+    )
+    try {
+        val root = RemoteViewsRoot(MaxComposeTreeDepth)
+        val applier = Applier(root)
+        val recomposer = Recomposer(coroutineContext)
+        val composition = Composition(applier, recomposer)
+        composition.setContent {
+            CompositionLocalProvider(
+                LocalContext provides context,
+                LocalGlanceId provides id,
+                LocalAppWidgetOptions provides finalOptions,
+                LocalState provides glanceState,
+            ) {
+                ForEachSize(sizeMode, size ?: minSize, content)
+            }
+        }
+        withContext(BroadcastFrameClock()) {
+            launch { recomposer.runRecomposeAndApplyChanges() }
+            recomposer.close()
+            recomposer.join()
+        }
+        normalizeCompositionTree(root)
+        return translateComposition(
+            context,
+            appWidgetId,
+            root,
+            layoutConfig,
+            layoutConfig.addLayout(root),
+            DpSize.Unspecified,
+        )
+    } finally {
+        layoutConfig.save()
+    }
+}
+
+/**
+ * Creates a snapshot of the [GlanceAppWidget] content without running recomposition.
+ *
+ * This runs the composition one time and translates it to [RemoteViews].
+ */
+internal suspend fun GlanceAppWidget.compose(
+    @Suppress("ContextFirst") context: Context,
+    id: GlanceId,
+    options: Bundle? = null,
+    size: DpSize? = null,
+    state: Any? = null,
+): RemoteViews =
+    compose(
+        context = context,
+        id = id,
+        sizeMode = if (size != null) SizeMode.Single else sizeMode,
+        size = size,
+        state = state,
+        options = options,
+        content = runGlance(context, id).first { it != null }!!,
+    )
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 7490c7f..92f688c 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
@@ -16,7 +16,6 @@
 
 package androidx.glance.appwidget
 
-import android.appwidget.AppWidgetManager
 import android.content.Context
 import android.os.Bundle
 import android.util.Log
@@ -35,7 +34,6 @@
 import androidx.compose.ui.unit.DpSize
 import androidx.glance.EmittableWithChildren
 import androidx.glance.GlanceComposable
-import androidx.glance.GlanceId
 import androidx.glance.LocalContext
 import androidx.glance.LocalGlanceId
 import androidx.glance.LocalState
@@ -43,14 +41,7 @@
 import androidx.glance.session.Session
 import androidx.glance.state.ConfigManager
 import androidx.glance.state.GlanceState
-import java.util.concurrent.atomic.AtomicReference
-import kotlin.coroutines.CoroutineContext
-import kotlinx.coroutines.CancellableContinuation
 import kotlinx.coroutines.CancellationException
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.channelFlow
-import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.coroutines.withContext
 
 /**
  * A session that composes UI for a single app widget.
@@ -220,53 +211,4 @@
     internal class UpdateAppWidgetOptions(val newOptions: Bundle)
     @VisibleForTesting
     internal class RunLambda(val key: String)
-
-    private val Context.appWidgetManager: AppWidgetManager
-        get() = this.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager
 }
-
-internal fun interface ContentReceiver : CoroutineContext.Element {
-    /**
-     * Provide [content] to the Glance session, suspending until the session is
-     * shut down.
-     *
-     * If this function is called concurrently with itself, the previous call will throw
-     * [CancellationException] and the new content will replace it.
-     */
-    suspend fun provideContent(
-        content: @Composable @GlanceComposable () -> Unit
-    ): Nothing
-
-    override val key: CoroutineContext.Key<*> get() = Key
-
-    companion object Key : CoroutineContext.Key<ContentReceiver>
-}
-
-internal fun GlanceAppWidget.runGlance(
-    context: Context,
-    id: GlanceId,
-): Flow<(@GlanceComposable @Composable () -> Unit)?> = channelFlow {
-    val contentCoroutine: AtomicReference<CancellableContinuation<Nothing>?> =
-        AtomicReference(null)
-    val receiver = ContentReceiver { content ->
-        suspendCancellableCoroutine {
-            it.invokeOnCancellation { trySend(null) }
-            contentCoroutine.getAndSet(it)?.cancel()
-            trySend(content)
-        }
-    }
-    withContext(receiver) { provideGlance(context, id) }
-}
-
-internal val Context.appWidgetManager: AppWidgetManager
-    get() = this.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager
-
-internal fun createUniqueRemoteUiName(appWidgetId: Int) = "appWidget-$appWidgetId"
-
-internal fun AppWidgetId.toSessionKey() = createUniqueRemoteUiName(appWidgetId)
-
-/**
- * Maximum depth for a composition. Although there is no hard limit, this should avoid deep
- * recursions, which would create [RemoteViews] too large to be sent.
- */
-private const val MaxComposeTreeDepth = 50
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetUtils.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetUtils.kt
index 1ae6a21..853e676 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetUtils.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetUtils.kt
@@ -18,20 +18,39 @@
 
 import android.appwidget.AppWidgetManager
 import android.appwidget.AppWidgetProviderInfo
+import android.content.Context
 import android.os.Build
 import android.os.Bundle
 import android.os.Trace
 import android.util.DisplayMetrics
 import android.util.Log
 import android.util.SizeF
+import android.widget.RemoteViews
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import androidx.compose.runtime.Composable
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
+import androidx.glance.GlanceComposable
+import androidx.glance.GlanceId
 import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicReference
+import kotlin.coroutines.CoroutineContext
 import kotlin.math.ceil
 import kotlin.math.min
+import kotlinx.coroutines.CancellableContinuation
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.channelFlow
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withContext
+
+/**
+ * Maximum depth for a composition. Although there is no hard limit, this should avoid deep
+ * recursions, which would create [RemoteViews] too large to be sent.
+ */
+internal const val MaxComposeTreeDepth = 50
 
 // Retrieves the minimum size of an App Widget, as configured by the App Widget provider.
 internal fun appWidgetMinSize(
@@ -191,4 +210,44 @@
         methodName: String,
         cookie: Int,
     ) = Trace.endAsyncSection(methodName, cookie)
-}
\ No newline at end of file
+}
+
+internal val Context.appWidgetManager: AppWidgetManager
+    get() = this.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager
+
+internal fun createUniqueRemoteUiName(appWidgetId: Int) = "appWidget-$appWidgetId"
+
+internal fun AppWidgetId.toSessionKey() = createUniqueRemoteUiName(appWidgetId)
+
+internal fun interface ContentReceiver : CoroutineContext.Element {
+    /**
+     * Provide [content] to the Glance session, suspending until the session is
+     * shut down.
+     *
+     * If this function is called concurrently with itself, the previous call will throw
+     * [CancellationException] and the new content will replace it.
+     */
+    suspend fun provideContent(
+        content: @Composable @GlanceComposable () -> Unit
+    ): Nothing
+
+    override val key: CoroutineContext.Key<*> get() = Key
+
+    companion object Key : CoroutineContext.Key<ContentReceiver>
+}
+
+internal fun GlanceAppWidget.runGlance(
+    context: Context,
+    id: GlanceId,
+): Flow<(@GlanceComposable @Composable () -> Unit)?> = channelFlow {
+    val contentCoroutine: AtomicReference<CancellableContinuation<Nothing>?> =
+        AtomicReference(null)
+    val receiver = ContentReceiver { content ->
+        suspendCancellableCoroutine {
+            it.invokeOnCancellation { trySend(null) }
+            contentCoroutine.getAndSet(it)?.cancel()
+            trySend(content)
+        }
+    }
+    withContext(receiver) { provideGlance(context, id) }
+}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CheckBox.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CheckBox.kt
index d27cadf..bc88b30 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CheckBox.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CheckBox.kt
@@ -24,6 +24,7 @@
 import androidx.glance.GlanceTheme
 import androidx.glance.action.Action
 import androidx.glance.action.ActionModifier
+import androidx.glance.action.action
 import androidx.glance.appwidget.action.CompoundButtonAction
 import androidx.glance.appwidget.unit.CheckableColorProvider
 import androidx.glance.appwidget.unit.CheckedUncheckedColorProvider.Companion.createCheckableColorProvider
@@ -83,7 +84,7 @@
     val colorProvider = if (GlanceTheme.colors == DynamicThemeColorProviders) {
         // If using the m3 dynamic color theme, we need to create a color provider from xml
         // because resource backed ColorStateLists cannot be created programmatically
-         ResourceCheckableColorProvider(R.color.glance_default_check_box)
+        ResourceCheckableColorProvider(R.color.glance_default_check_box)
     } else {
         createCheckableColorProvider(
             source = "CheckBoxColors",
@@ -119,6 +120,48 @@
     style: TextStyle? = null,
     colors: CheckBoxColors = checkBoxColors(),
     maxLines: Int = Int.MAX_VALUE,
+) = CheckBoxElement(checked, onCheckedChange, modifier, text, style, colors, maxLines)
+
+/**
+ * Adds a check box view to the glance view.
+ *
+ * @param checked whether the check box is checked
+ * @param onCheckedChange the action to be run when the checkbox is clicked
+ * @param modifier the modifier to apply to the check box
+ * @param text the text to display to the end of the check box
+ * @param style the style to apply to [text]
+ * @param colors the color tint to apply to the check box
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated.
+ */
+@Composable
+fun CheckBox(
+    checked: Boolean,
+    onCheckedChange: () -> Unit,
+    modifier: GlanceModifier = GlanceModifier,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: CheckBoxColors = checkBoxColors(),
+    maxLines: Int = Int.MAX_VALUE,
+) = CheckBoxElement(
+    checked,
+    action(block = onCheckedChange),
+    modifier,
+    text,
+    style,
+    colors,
+    maxLines
+)
+
+@Composable
+private fun CheckBoxElement(
+    checked: Boolean,
+    onCheckedChange: Action?,
+    modifier: GlanceModifier = GlanceModifier,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: CheckBoxColors = checkBoxColors(),
+    maxLines: Int = Int.MAX_VALUE,
 ) {
     val finalModifier = if (onCheckedChange != null) {
         modifier.then(ActionModifier(CompoundButtonAction(onCheckedChange, checked)))
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
index 0dd2fd7..8fafe34 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
@@ -22,45 +22,25 @@
 import android.os.Bundle
 import android.util.Log
 import android.widget.RemoteViews
-import androidx.annotation.DoNotInline
 import androidx.annotation.LayoutRes
-import androidx.annotation.RequiresApi
-import androidx.annotation.VisibleForTesting
-import androidx.compose.runtime.BroadcastFrameClock
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Composition
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.Recomposer
-import androidx.compose.ui.unit.DpSize
-import androidx.glance.Applier
 import androidx.glance.GlanceComposable
 import androidx.glance.GlanceId
-import androidx.glance.LocalContext
-import androidx.glance.LocalGlanceId
-import androidx.glance.LocalSize
-import androidx.glance.LocalState
 import androidx.glance.appwidget.state.getAppWidgetState
+import androidx.glance.session.GlanceSessionManager
 import androidx.glance.session.SessionManager
 import androidx.glance.state.GlanceState
 import androidx.glance.state.GlanceStateDefinition
 import androidx.glance.state.PreferencesGlanceStateDefinition
 import kotlin.coroutines.coroutineContext
 import kotlinx.coroutines.CancellationException
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /**
  * Object handling the composition and the communication with [AppWidgetManager].
  *
- * The UI is defined by the [Content] composable function. Calling [update] will start
- * the composition and translate [Content] into a [RemoteViews] which is then sent to the
- * [AppWidgetManager].
+ * The UI is defined by calling [provideContent] from within [provideGlance].
+ * When the widget is requested, the composition is run and translated into a [RemoteViews] which is
+ * then sent to the [AppWidgetManager].
  *
  * @param errorUiLayout If different from 0 and an error occurs within this GlanceAppWidget,
  * the App Widget is updated with an error UI using this layout resource ID.
@@ -69,25 +49,36 @@
     @LayoutRes
     internal val errorUiLayout: Int = R.layout.glance_error_layout,
 ) {
+    private val sessionManager: SessionManager = GlanceSessionManager
     /**
      * Override this function to provide the Glance Composable.
      *
      * This is a good place to load any data needed to render the Composable. Use
      * [provideContent] to provide the Composable once it is ready.
-     *
-     * TODO(b/239747024) make abstract once Content() is removed.
      */
-    open suspend fun provideGlance(context: Context, id: GlanceId) {
-        provideContent { Content() }
+    open suspend fun provideGlance(
+        context: Context,
+        id: GlanceId,
+    ) {
+        provideContent { @Suppress("DEPRECATION") Content() }
     }
 
     /**
-     * Definition of the UI.
-     * TODO(b/239747024) remove and update any usage to the new provideGlance API.
+     * Provide the Glance Composable.
      */
     @Composable
     @GlanceComposable
-    abstract fun Content()
+    @Deprecated(
+        message = "Override provideGlance to provide the Composable.",
+        replaceWith = ReplaceWith(
+            "override suspend fun provideGlance(context: Context, id: GlanceId) {" +
+            "    provideContent { /** Composable content **/ }" +
+            "}",
+            "androidx.glance.appwidget.provideContent",
+        ),
+        level = DeprecationLevel.WARNING,
+    )
+    open fun Content() {}
 
     /**
      * Defines the handling of sizes.
@@ -106,20 +97,15 @@
      */
     open suspend fun onDelete(context: Context, glanceId: GlanceId) {}
 
-    // TODO(b/239747024) remove once SessionManager is the default
-    open val sessionManager: SessionManager? = null
-
     /**
-     * Triggers the composition of [Content] and sends the result to the [AppWidgetManager].
+     * Run the composition in [provideGlance] and send the result to [AppWidgetManager].
      */
     suspend fun update(
         context: Context,
-        glanceId: GlanceId
+        id: GlanceId
     ) {
-        require(glanceId is AppWidgetId) {
-            "The glanceId '$glanceId' is not a valid App Widget glance id"
-        }
-        update(context, AppWidgetManager.getInstance(context), glanceId.appWidgetId)
+        require(id is AppWidgetId)
+        update(context, id.appWidgetId)
     }
 
     /**
@@ -129,7 +115,7 @@
      */
     internal suspend fun deleted(context: Context, appWidgetId: Int) {
         val glanceId = AppWidgetId(appWidgetId)
-        sessionManager?.closeSession(glanceId.toSessionKey())
+        sessionManager.closeSession(glanceId.toSessionKey())
         try {
             onDelete(context, glanceId)
         } catch (cancelled: CancellationException) {
@@ -148,36 +134,22 @@
      */
     internal suspend fun update(
         context: Context,
-        appWidgetManager: AppWidgetManager,
         appWidgetId: Int,
         options: Bundle? = null,
     ) {
         Tracing.beginGlanceAppWidgetUpdate()
-        sessionManager?.let {
-            val glanceId = AppWidgetId(appWidgetId)
-            if (!it.isSessionRunning(context, glanceId.toSessionKey())) {
-                it.startSession(context, AppWidgetSession(this, glanceId, options))
-            } else {
-                val session = it.getSession(glanceId.toSessionKey()) as AppWidgetSession
-                session.updateGlance()
-            }
-            return
-        }
-        safeRun(context, appWidgetManager, appWidgetId) {
-            val opts = options ?: appWidgetManager.getAppWidgetOptions(appWidgetId)!!
-            val state = stateDefinition?.let {
-                GlanceState.getValue(context, it, createUniqueRemoteUiName(appWidgetId))
-            }
-            appWidgetManager.updateAppWidget(
-                appWidgetId,
-                compose(context, appWidgetManager, appWidgetId, state, opts)
-            )
+        val glanceId = AppWidgetId(appWidgetId)
+        if (!sessionManager.isSessionRunning(context, glanceId.toSessionKey())) {
+            sessionManager.startSession(context, AppWidgetSession(this, glanceId, options))
+        } else {
+            val session = sessionManager.getSession(glanceId.toSessionKey()) as AppWidgetSession
+            session.updateGlance()
         }
     }
 
     /**
-     * Trigger an action to be run in the AppWidgetSession for this widget, starting the session if
-     * necessary.
+     * Trigger an action to be run in the [AppWidgetSession] for this widget, starting the session
+     * if necessary.
      */
     internal suspend fun triggerAction(
         context: Context,
@@ -185,19 +157,15 @@
         actionKey: String,
         options: Bundle? = null,
     ) {
-        sessionManager?.let { manager ->
-            val glanceId = AppWidgetId(appWidgetId)
-            val session = if (!manager.isSessionRunning(context, glanceId.toSessionKey())) {
-                AppWidgetSession(this, glanceId, options).also { session ->
-                    manager.startSession(context, session)
-                }
-            } else {
-                manager.getSession(glanceId.toSessionKey()) as AppWidgetSession
+        val glanceId = AppWidgetId(appWidgetId)
+        val session = if (!sessionManager.isSessionRunning(context, glanceId.toSessionKey())) {
+            AppWidgetSession(this, glanceId, options).also { session ->
+                sessionManager.startSession(context, session)
             }
-            session.runLambda(actionKey)
-        } ?: error(
-            "GlanceAppWidget.triggerAction may only be used when a SessionManager is provided"
-        )
+        } else {
+            sessionManager.getSession(glanceId.toSessionKey()) as AppWidgetSession
+        }
+        session.runLambda(actionKey)
     }
 
     /**
@@ -205,340 +173,24 @@
      */
     internal suspend fun resize(
         context: Context,
-        appWidgetManager: AppWidgetManager,
         appWidgetId: Int,
         options: Bundle
     ) {
-        sessionManager?.let { manager ->
-            val glanceId = AppWidgetId(appWidgetId)
-            if (!manager.isSessionRunning(context, glanceId.toSessionKey())) {
-                manager.startSession(context, AppWidgetSession(this, glanceId, options))
-            } else {
-                val session = manager.getSession(glanceId.toSessionKey()) as AppWidgetSession
-                session.updateAppWidgetOptions(options)
-            }
-            return
-        }
         // Note, on Android S, if the mode is `Responsive`, then all the sizes are specified from
         // the start and we don't need to update the AppWidget when the size changes.
-        if (sizeMode is SizeMode.Exact ||
-            (Build.VERSION.SDK_INT < Build.VERSION_CODES.S && sizeMode is SizeMode.Responsive)
+        if (sizeMode is SizeMode.Single ||
+            (Build.VERSION.SDK_INT > Build.VERSION_CODES.S && sizeMode is SizeMode.Responsive)
         ) {
-            update(context, appWidgetManager, appWidgetId, options)
+            return
         }
-    }
-
-    // Trigger the composition of the View to create the RemoteViews.
-    @VisibleForTesting
-    internal suspend fun compose(
-        context: Context,
-        appWidgetManager: AppWidgetManager,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle
-    ): RemoteViews {
-        val layoutConfig = LayoutConfiguration.load(context, appWidgetId)
-        return try {
-            compose(context, appWidgetManager, appWidgetId, state, options, layoutConfig)
-        } finally {
-            layoutConfig.save()
-        }
-    }
-
-    @VisibleForTesting
-    internal suspend fun compose(
-        context: Context,
-        appWidgetManager: AppWidgetManager,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle,
-        layoutConfig: LayoutConfiguration,
-    ): RemoteViews =
-        when (val localSizeMode = this.sizeMode) {
-            is SizeMode.Single -> {
-                composeForSize(
-                    context,
-                    appWidgetId,
-                    state,
-                    options,
-                    appWidgetMinSize(
-                        context.resources.displayMetrics,
-                        appWidgetManager,
-                        appWidgetId
-                    ),
-                    layoutConfig,
-                )
-            }
-
-            is SizeMode.Exact -> {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                    Api31Impl.composeAllSizes(
-                        this,
-                        context,
-                        appWidgetId,
-                        state,
-                        options,
-                        options.extractAllSizes {
-                            appWidgetMinSize(
-                                context.resources.displayMetrics,
-                                appWidgetManager,
-                                appWidgetId
-                            )
-                        },
-                        layoutConfig,
-                    )
-                } else {
-                    composeExactMode(
-                        context,
-                        appWidgetManager,
-                        appWidgetId,
-                        state,
-                        options,
-                        layoutConfig,
-                    )
-                }
-            }
-
-            is SizeMode.Responsive -> {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                    Api31Impl.composeAllSizes(
-                        this,
-                        context,
-                        appWidgetId,
-                        state,
-                        options,
-                        localSizeMode.sizes,
-                        layoutConfig,
-                    )
-                } else {
-                    composeResponsiveMode(
-                        context,
-                        appWidgetId,
-                        state,
-                        options,
-                        localSizeMode.sizes,
-                        layoutConfig,
-                    )
-                }
-            }
-        }
-
-    private suspend fun composeExactMode(
-        context: Context,
-        appWidgetManager: AppWidgetManager,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle,
-        layoutConfig: LayoutConfiguration,
-    ) = coroutineScope {
-        val views =
-            options.extractOrientationSizes()
-                .map { size ->
-                    async {
-                        composeForSize(
-                            context,
-                            appWidgetId,
-                            state,
-                            options,
-                            size,
-                            layoutConfig,
-                        )
-                    }
-                }.awaitAll()
-        combineLandscapeAndPortrait(views) ?: composeForSize(
-            context,
-            appWidgetId,
-            state,
-            options,
-            appWidgetMinSize(context.resources.displayMetrics, appWidgetManager, appWidgetId),
-            layoutConfig,
-        )
-    }
-
-    // Combine the views, which should be landscape and portrait, in that order, if they are
-    // available.
-    private fun combineLandscapeAndPortrait(views: List<RemoteViews>): RemoteViews? =
-        when (views.size) {
-            2 -> RemoteViews(views[0], views[1])
-            1 -> views[0]
-            0 -> null
-            else -> throw IllegalArgumentException("There must be between 0 and 2 views.")
-        }
-
-    private suspend fun composeResponsiveMode(
-        context: Context,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle,
-        sizes: Set<DpSize>,
-        layoutConfig: LayoutConfiguration,
-    ) = coroutineScope {
-        // Find the best view, emulating what Android S+ would do.
-        val orderedSizes = sizes.sortedBySize()
-        val smallestSize = orderedSizes[0]
-        val views =
-            options.extractOrientationSizes()
-                .map { size ->
-                    findBestSize(size, sizes) ?: smallestSize
-                }
-                .map { size ->
-                    async {
-                        composeForSize(
-                            context,
-                            appWidgetId,
-                            state,
-                            options,
-                            size,
-                            layoutConfig,
-                        )
-                    }
-                }.awaitAll()
-        combineLandscapeAndPortrait(views) ?: composeForSize(
-            context,
-            appWidgetId,
-            state,
-            options,
-            smallestSize,
-            layoutConfig,
-        )
-    }
-
-    @VisibleForTesting
-    internal suspend fun composeForSize(
-        context: Context,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle,
-        size: DpSize,
-        layoutConfig: LayoutConfiguration,
-    ): RemoteViews = withContext(BroadcastFrameClock()) {
-        // The maximum depth must be reduced if the compositions are combined
-        val root = RemoteViewsRoot(maxDepth = MaxComposeTreeDepth)
-        val applier = Applier(root)
-        val recomposer = Recomposer(coroutineContext)
-        val composition = Composition(applier, recomposer)
         val glanceId = AppWidgetId(appWidgetId)
-        composition.setContent(context, glanceId, options, state, size)
-
-        launch { recomposer.runRecomposeAndApplyChanges() }
-        recomposer.close()
-        recomposer.join()
-
-        normalizeCompositionTree(root)
-
-        translateComposition(
-            context,
-            appWidgetId,
-            root,
-            layoutConfig,
-            layoutConfig.addLayout(root),
-            size
-        )
-    }
-
-    private fun Composition.setContent(
-        context: Context,
-        glanceId: AppWidgetId,
-        options: Bundle,
-        state: Any?,
-        size: DpSize
-    ) {
-        setContent {
-            CompositionLocalProvider(
-                LocalContext provides context,
-                LocalGlanceId provides glanceId,
-                LocalAppWidgetOptions provides options,
-                LocalState provides state,
-                LocalSize provides size,
-            ) { Content() }
+        if (!sessionManager.isSessionRunning(context, glanceId.toSessionKey())) {
+            sessionManager.startSession(context, AppWidgetSession(this, glanceId, options))
+        } else {
+            val session = sessionManager.getSession(glanceId.toSessionKey()) as AppWidgetSession
+            session.updateAppWidgetOptions(options)
         }
     }
-
-    private companion object {
-        /**
-         * Maximum depth for a composition. Although there is no hard limit, this should avoid deep
-         * recursions, which would create [RemoteViews] too large to be sent.
-         */
-        private const val MaxComposeTreeDepth = 50
-    }
-
-    @RequiresApi(Build.VERSION_CODES.S)
-    private object Api31Impl {
-        @DoNotInline
-        suspend fun composeAllSizes(
-            glance: GlanceAppWidget,
-            context: Context,
-            appWidgetId: Int,
-            state: Any?,
-            options: Bundle,
-            allSizes: Collection<DpSize>,
-            layoutConfig: LayoutConfiguration
-        ): RemoteViews = coroutineScope {
-            val allViews =
-                allSizes.map { size ->
-                    async {
-                        size.toSizeF() to glance.composeForSize(
-                            context,
-                            appWidgetId,
-                            state,
-                            options,
-                            size,
-                            layoutConfig,
-                        )
-                    }
-                }.awaitAll()
-            allViews.singleOrNull()?.second ?: RemoteViews(allViews.toMap())
-        }
-    }
-
-    private suspend fun safeRun(
-        context: Context,
-        appWidgetManager: AppWidgetManager,
-        appWidgetId: Int,
-        block: suspend () -> Unit,
-    ) {
-        try {
-            block()
-        } catch (ex: CancellationException) {
-            // Nothing to do
-        } catch (throwable: Throwable) {
-            if (errorUiLayout == 0) {
-                throw throwable
-            }
-            logException(throwable)
-            val rv = RemoteViews(context.packageName, errorUiLayout)
-            appWidgetManager.updateAppWidget(appWidgetId, rv)
-        } finally {
-            Tracing.endGlanceAppWidgetUpdate()
-        }
-    }
-
-    /**
-     * Creates a snapshot of the GlanceAppWidget content without running recomposition.
-     * Useful to only generate once the composed RemoteViews instance.
-     *
-     * @see GlanceAppWidget.composeForSize
-     * @see GlanceAppWidgetManager.requestPinGlanceAppWidget
-     */
-    internal fun snapshot(
-        context: Context,
-        appWidgetId: Int,
-        state: Any?,
-        options: Bundle,
-        size: DpSize,
-    ): RemoteViews {
-        // The maximum depth must be reduced if the compositions are combined
-        val root = RemoteViewsRoot(maxDepth = MaxComposeTreeDepth)
-        val applier = Applier(root)
-        val scope = CoroutineScope(Job() + Dispatchers.Main)
-        val recomposer = Recomposer(scope.coroutineContext)
-        val composition = Composition(applier, recomposer)
-        val glanceId = AppWidgetId(appWidgetId)
-
-        composition.setContent(context, glanceId, options, state, size)
-        normalizeCompositionTree(root)
-        return translateComposition(context, appWidgetId, root, null, 0, size)
-    }
 }
 
 internal data class AppWidgetId(val appWidgetId: Int) : GlanceId
@@ -582,4 +234,4 @@
     coroutineContext[ContentReceiver]?.provideContent(content)
         ?: error("provideContent requires a ContentReceiver and should only be called from " +
             "GlanceAppWidget.provideGlance")
-}
\ No newline at end of file
+}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
index 09442fa..6c4aedb 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
@@ -183,7 +183,7 @@
      *
      * @see AppWidgetManager.requestPinAppWidget for more information and limitations
      */
-    fun <T : GlanceAppWidgetReceiver> requestPinGlanceAppWidget(
+    suspend fun <T : GlanceAppWidgetReceiver> requestPinGlanceAppWidget(
         receiver: Class<T>,
         preview: GlanceAppWidget? = null,
         previewState: Any? = null,
@@ -199,9 +199,9 @@
                     val info = appWidgetManager.installedProviders.first {
                         it.provider == target
                     }
-                    val snapshot = preview.snapshot(
+                    val snapshot = preview.compose(
                         context = context,
-                        appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID,
+                        id = AppWidgetId(AppWidgetManager.INVALID_APPWIDGET_ID),
                         state = previewState,
                         options = Bundle.EMPTY,
                         size = info.getMinSize(context.resources.displayMetrics),
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
index 93d8962..9031d03d 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
@@ -88,7 +88,7 @@
         }
         goAsync {
             updateManager(context)
-            appWidgetIds.map { async { glanceAppWidget.update(context, appWidgetManager, it) } }
+            appWidgetIds.map { async { glanceAppWidget.update(context, it) } }
                 .awaitAll()
         }
     }
@@ -102,7 +102,7 @@
     ) {
         goAsync {
             updateManager(context)
-            glanceAppWidget.resize(context, appWidgetManager, appWidgetId, newOptions)
+            glanceAppWidget.resize(context, appWidgetId, newOptions)
         }
     }
 
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RadioButton.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RadioButton.kt
index e4d818e..48bafbc 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RadioButton.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RadioButton.kt
@@ -23,6 +23,7 @@
 import androidx.glance.GlanceNode
 import androidx.glance.GlanceTheme
 import androidx.glance.action.Action
+import androidx.glance.action.action
 import androidx.glance.action.clickable
 import androidx.glance.appwidget.unit.CheckableColorProvider
 import androidx.glance.appwidget.unit.CheckedUncheckedColorProvider.Companion.createCheckableColorProvider
@@ -142,6 +143,56 @@
     style: TextStyle? = null,
     colors: RadioButtonColors = radioButtonColors(),
     maxLines: Int = Int.MAX_VALUE,
+) = RadioButtonElement(checked, onClick, modifier, enabled, text, style, colors, maxLines)
+
+/**
+ * Adds a radio button to the glance view.
+ *
+ * When showing a [Row] or [Column] that has [RadioButton] children, use
+ * [GlanceModifier.selectableGroup] to enable the radio group effect (unselecting the previously
+ * selected radio button when another is selected).
+ *
+ * @param checked whether the radio button is checked
+ * @param onClick the action to be run when the radio button is clicked
+ * @param modifier the modifier to apply to the radio button
+ * @param enabled if false, the radio button will not be clickable
+ * @param text the text to display to the end of the radio button
+ * @param style the style to apply to [text]
+ * @param colors the color tint to apply to the radio button
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated.
+ */
+@Composable
+fun RadioButton(
+    checked: Boolean,
+    onClick: () -> Unit,
+    modifier: GlanceModifier = GlanceModifier,
+    enabled: Boolean = true,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: RadioButtonColors = radioButtonColors(),
+    maxLines: Int = Int.MAX_VALUE,
+) = RadioButtonElement(
+    checked,
+    action(block = onClick),
+    modifier,
+    enabled,
+    text,
+    style,
+    colors,
+    maxLines
+)
+
+@Composable
+private fun RadioButtonElement(
+    checked: Boolean,
+    onClick: Action?,
+    modifier: GlanceModifier = GlanceModifier,
+    enabled: Boolean = true,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: RadioButtonColors = radioButtonColors(),
+    maxLines: Int = Int.MAX_VALUE,
 ) {
     val finalModifier = if (enabled && onClick != null) modifier.clickable(onClick) else modifier
     GlanceNode(factory = { EmittableRadioButton(colors) }, update = {
@@ -154,7 +205,6 @@
         this.set(maxLines) { this.maxLines = it }
     })
 }
-
 /**
  * Use this modifier to group a list of RadioButtons together for accessibility purposes.
  *
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeBox.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeBox.kt
index 8425999..f4dd6cd 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeBox.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeBox.kt
@@ -106,7 +106,7 @@
         } else {
             val smallestSize = sizeMode.sizes.sortedBySize()[0]
             LocalAppWidgetOptions.current.extractOrientationSizes()
-                .mapNotNull { findBestSize(it, sizeMode.sizes) }
+                .map { findBestSize(it, sizeMode.sizes) ?: smallestSize }
                 .ifEmpty { listOf(smallestSize, smallestSize) }
         }
     }
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Switch.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Switch.kt
index cdc36f6..4097244 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Switch.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Switch.kt
@@ -23,6 +23,7 @@
 import androidx.glance.GlanceTheme
 import androidx.glance.action.Action
 import androidx.glance.action.ActionModifier
+import androidx.glance.action.action
 import androidx.glance.appwidget.action.CompoundButtonAction
 import androidx.glance.appwidget.unit.CheckableColorProvider
 import androidx.glance.appwidget.unit.CheckedUncheckedColorProvider.Companion.createCheckableColorProvider
@@ -117,6 +118,48 @@
     style: TextStyle? = null,
     colors: SwitchColors = switchColors(),
     maxLines: Int = Int.MAX_VALUE,
+) = SwitchElement(checked, onCheckedChange, modifier, text, style, colors, maxLines)
+
+/**
+ * Adds a switch view to the glance view.
+ *
+ * @param checked whether the switch is checked
+ * @param onCheckedChange the action to be run when the switch is clicked
+ * @param modifier the modifier to apply to the switch
+ * @param text the text to display to the end of the switch
+ * @param style the style to apply to [text]
+ * @param colors the tint colors for the thumb and track of the switch
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated.
+ */
+@Composable
+fun Switch(
+    checked: Boolean,
+    onCheckedChange: () -> Unit,
+    modifier: GlanceModifier = GlanceModifier,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: SwitchColors = switchColors(),
+    maxLines: Int = Int.MAX_VALUE,
+) = SwitchElement(
+    checked,
+    action(block = onCheckedChange),
+    modifier,
+    text,
+    style,
+    colors,
+    maxLines
+)
+
+@Composable
+private fun SwitchElement(
+    checked: Boolean,
+    onCheckedChange: Action?,
+    modifier: GlanceModifier = GlanceModifier,
+    text: String = "",
+    style: TextStyle? = null,
+    colors: SwitchColors = switchColors(),
+    maxLines: Int = Int.MAX_VALUE,
 ) {
     val finalModifier = if (onCheckedChange != null) {
         modifier.then(ActionModifier(CompoundButtonAction(onCheckedChange, checked)))
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyList.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyList.kt
index a9286e32..5e4d046 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyList.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyList.kt
@@ -17,6 +17,7 @@
 package androidx.glance.appwidget.lazy
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.key
 import androidx.glance.Emittable
 import androidx.glance.EmittableWithChildren
 import androidx.glance.GlanceModifier
@@ -99,14 +100,18 @@
     alignment: Alignment,
     content: @Composable () -> Unit
 ) {
-    GlanceNode(
-        factory = ::EmittableLazyListItem,
-        update = {
-            this.set(itemId) { this.itemId = it }
-            this.set(alignment) { this.alignment = it }
-        },
-        content = content
-    )
+    // We wrap LazyListItem in the key composable to ensure that lambda actions declared within each
+    // item's scope will get a unique ID based on the currentCompositeKeyHash.
+    key(itemId) {
+        GlanceNode(
+            factory = ::EmittableLazyListItem,
+            update = {
+                this.set(itemId) { this.itemId = it }
+                this.set(alignment) { this.alignment = it }
+            },
+            content = content
+        )
+    }
 }
 
 /**
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
index 79ace6f..c0d1f50 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
@@ -23,6 +23,7 @@
 import androidx.glance.layout.fillMaxWidth
 import androidx.glance.layout.wrapContentHeight
 import androidx.annotation.RequiresApi
+import androidx.compose.runtime.key
 import androidx.compose.ui.unit.Dp
 import androidx.glance.Emittable
 
@@ -105,14 +106,18 @@
     alignment: Alignment,
     content: @Composable () -> Unit
 ) {
-    GlanceNode(
-        factory = ::EmittableLazyVerticalGridListItem,
-        update = {
-            this.set(itemId) { this.itemId = it }
-            this.set(alignment) { this.alignment = it }
-        },
-        content = content
-    )
+    // We wrap LazyVerticalGridItem in the key composable to ensure that lambda actions declared
+    // within each item's scope will get a unique ID based on the currentCompositeKeyHash.
+    key(itemId) {
+        GlanceNode(
+            factory = ::EmittableLazyVerticalGridListItem,
+            update = {
+                this.set(itemId) { this.itemId = it }
+                this.set(alignment) { this.alignment = it }
+            },
+            content = content
+        )
+    }
 }
 
 @JvmDefaultWithCompatibility
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceTemplateAppWidget.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceTemplateAppWidget.kt
index a090b3f..7774bcb 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceTemplateAppWidget.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceTemplateAppWidget.kt
@@ -16,15 +16,18 @@
 
 package androidx.glance.appwidget.template
 
+import android.content.Context
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.glance.GlanceComposable
+import androidx.glance.GlanceId
 import androidx.glance.LocalSize
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.SizeMode
+import androidx.glance.appwidget.provideContent
 import androidx.glance.state.GlanceStateDefinition
 import androidx.glance.state.PreferencesGlanceStateDefinition
 import androidx.glance.template.LocalTemplateMode
@@ -68,16 +71,14 @@
     /** Default widget state definition is [PreferencesGlanceStateDefinition] */
     override val stateDefinition: GlanceStateDefinition<*>? = PreferencesGlanceStateDefinition
 
-    @Composable
-    final override fun Content() {
-        // TODO: Add other local values
-        val mode = mode()
-        CompositionLocalProvider(
-            LocalTemplateMode provides mode,
-        ) {
-            TemplateContent()
+    final override suspend fun provideGlance(context: Context, id: GlanceId) =
+        provideContent {
+            CompositionLocalProvider(
+                LocalTemplateMode provides mode(),
+            ) {
+                TemplateContent()
+            }
         }
-    }
 
     @Composable
     @GlanceComposable
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/androidMain/res/layout/glance_vertical_grid_auto_fit.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_auto_fit.xml
index 090f44c0..d71b95f 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_auto_fit.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_auto_fit.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="auto_fit"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_five_columns.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_five_columns.xml
index 55d7461..2cb9b3d 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_five_columns.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_five_columns.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="5"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_four_columns.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_four_columns.xml
index 662fdd4..6a2d0a4 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_four_columns.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_four_columns.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="4"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_one_column.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_one_column.xml
index 9d2b48f0..a207b2db 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_one_column.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_one_column.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="1"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_three_columns.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_three_columns.xml
index a8ef7e9..f52b24e 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_three_columns.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_three_columns.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="3"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_two_columns.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_two_columns.xml
index 73b745d..b6c7b9d6 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_two_columns.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_vertical_grid_two_columns.xml
@@ -21,4 +21,5 @@
     android:layout_height="wrap_content"
     android:divider="@null"
     android:numColumns="2"
+    android:theme="@style/Glance.AppWidget.Theme.GridChildren"
     style="@style/Glance.AppWidget.VerticalGrid"/>
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..38f23cc 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,23 @@
 
 <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>
+    <style name="Glance.AppWidget.Theme.GridChildren" parent="">
+        <!--
+            AbsListView (extended by GridView) 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..06219df 100644
--- a/glance/glance-appwidget/src/main/res/values/themes.xml
+++ b/glance/glance-appwidget/src/main/res/values/themes.xml
@@ -16,4 +16,23 @@
 
 <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>
+    <style name="Glance.AppWidget.Theme.GridChildren" parent="">
+        <!--
+            AbsListView (extended by GridView) 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/kotlin/androidx/glance/appwidget/AppWidgetSessionTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/AppWidgetSessionTest.kt
index 5104c54..6972d7c 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/AppWidgetSessionTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/AppWidgetSessionTest.kt
@@ -20,7 +20,6 @@
 import android.appwidget.AppWidgetProviderInfo
 import android.content.Context
 import android.widget.TextView
-import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Recomposer
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
@@ -204,15 +203,6 @@
         assertTrue(didRunSecond)
     }
 
-    private class SampleGlanceAppWidget(
-        val ui: @Composable () -> Unit,
-    ) : GlanceAppWidget() {
-        @Composable
-        override fun Content() {
-            ui()
-        }
-    }
-
     private class TestGlanceState : ConfigManager {
 
         val getValueCalls = mutableListOf<String>()
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
index d0984d0..b2b2bf9 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
@@ -25,7 +25,6 @@
 import android.util.SizeF
 import android.widget.FrameLayout
 import android.widget.TextView
-import androidx.compose.runtime.Composable
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.max
@@ -34,7 +33,6 @@
 import androidx.glance.GlanceId
 import androidx.glance.LocalGlanceId
 import androidx.glance.LocalSize
-import androidx.glance.session.GlanceSessionManager
 import androidx.glance.text.Text
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
@@ -46,60 +44,39 @@
 import kotlinx.coroutines.flow.take
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.kotlin.mock
 import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
 import org.robolectric.annotation.Config
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(RobolectricTestRunner::class)
 class GlanceAppWidgetTest {
 
-    private lateinit var fakeCoroutineScope: TestScope
     private val context = ApplicationProvider.getApplicationContext<Context>()
     private val displayMetrics = context.resources.displayMetrics
-
-    @Before
-    fun setUp() {
-        fakeCoroutineScope = TestScope()
-    }
+    private val glanceId = AppWidgetId(1)
 
     @Test
-    fun createEmptyUi() = fakeCoroutineScope.runTest {
-        val composer = TestWidget { }
-
-        val rv = composer.composeForSize(
-            context,
-            1,
-            composer.stateDefinition,
-            Bundle(),
-            DpSize(40.dp, 50.dp),
-            LayoutConfiguration.create(context, 1),
-        )
-
+    fun createEmptyUi() = runTest {
+        val rv = TestWidget { }.compose(context, glanceId)
         val view = context.applyRemoteViews(rv)
         assertIs<FrameLayout>(view)
         assertThat(view.childCount).isEqualTo(0)
     }
 
     @Test
-    fun createUiWithSize() = fakeCoroutineScope.runTest {
-        val composer = TestWidget {
+    fun createUiWithSize() = runTest {
+        val rv = TestWidget {
             val size = LocalSize.current
             Text("${size.width} x ${size.height}")
-        }
-
-        val rv = composer.composeForSize(
+        }.compose(
             context,
-            1,
-            composer.stateDefinition,
-            Bundle(),
-            DpSize(40.dp, 50.dp),
-            LayoutConfiguration.create(context, 1),
+            glanceId,
+            size = DpSize(40.dp, 50.dp),
         )
 
         val view = context.applyRemoteViews(rv)
@@ -108,22 +85,15 @@
     }
 
     @Test
-    fun createUiFromOptionBundle() = fakeCoroutineScope.runTest {
-        val composer = TestWidget {
+    fun createUiFromOptionBundle() = runTest {
+        val rv = TestWidget {
             val options = LocalAppWidgetOptions.current
 
             Text(options.getString("StringKey", "<NOT FOUND>"))
-        }
-
-        val bundle = Bundle()
-        bundle.putString("StringKey", "FOUND")
-        val rv = composer.composeForSize(
+        }.compose(
             context,
-            1,
-            composer.stateDefinition,
-            bundle,
-            DpSize(40.dp, 50.dp),
-            LayoutConfiguration.create(context, 1),
+            glanceId,
+            bundleOf("StringKey" to "FOUND"),
         )
 
         val view = context.applyRemoteViews(rv)
@@ -132,22 +102,12 @@
     }
 
     @Test
-    fun createUiFromGlanceId() = fakeCoroutineScope.runTest {
-        val composer = TestWidget {
+    fun createUiFromGlanceId() = runTest {
+        val rv = TestWidget {
             val glanceId = LocalGlanceId.current
 
             Text(glanceId.toString())
-        }
-
-        val bundle = bundleOf("StringKey" to "FOUND")
-        val rv = composer.composeForSize(
-            context,
-            1,
-            composer.stateDefinition,
-            bundle,
-            DpSize(40.dp, 50.dp),
-            LayoutConfiguration.create(context, 1),
-        )
+        }.compose(context, glanceId)
 
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -155,31 +115,21 @@
     }
 
     @Test
-    fun createUiWithUniqueMode() = fakeCoroutineScope.runTest {
-        val composer = TestWidget {
+    fun createUiWithUniqueMode() = runTest {
+        val appWidgetManager = Shadows.shadowOf(
+            context.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager
+        )
+        appWidgetManager.addBoundWidget(glanceId.appWidgetId, appWidgetProviderInfo {
+            minWidth = 50
+            minHeight = 50
+            minResizeWidth = 40
+            minResizeHeight = 60
+            resizeMode = AppWidgetProviderInfo.RESIZE_BOTH
+        })
+        val rv = TestWidget {
             val size = LocalSize.current
             Text("${size.width} x ${size.height}")
-        }
-        val appWidgetManager = mock<AppWidgetManager> {
-            on { getAppWidgetInfo(1) }.thenReturn(
-                appWidgetProviderInfo {
-                    minWidth = 50
-                    minHeight = 50
-                    minResizeWidth = 40
-                    minResizeHeight = 60
-                    resizeMode = AppWidgetProviderInfo.RESIZE_BOTH
-                }
-            )
-        }
-
-        val rv = composer.compose(
-            context,
-            appWidgetManager,
-            appWidgetId = 1,
-            composer.stateDefinition,
-            options = Bundle(),
-            LayoutConfiguration.create(context, 2),
-        )
+        }.compose(context, glanceId)
 
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -188,23 +138,12 @@
 
     @Config(sdk = [30])
     @Test
-    fun createUiWithExactModePreS() = fakeCoroutineScope.runTest {
-        val composer = TestWidget(SizeMode.Exact) {
+    fun createUiWithExactModePreS() = runTest {
+        val options = optionsBundleOf(listOf(DpSize(100.dp, 50.dp), DpSize(50.dp, 100.dp)))
+        val rv = TestWidget(SizeMode.Exact) {
             val size = LocalSize.current
             Text("${size.width} x ${size.height}")
-        }
-        val options = optionsBundleOf(listOf(DpSize(100.dp, 50.dp), DpSize(50.dp, 100.dp)))
-        val appWidgetManager = mock<AppWidgetManager> {
-            on { getAppWidgetInfo(1) }.thenThrow(RuntimeException("This should not be called"))
-        }
-        val rv = composer.compose(
-            context,
-            appWidgetManager,
-            appWidgetId = 1,
-            composer.stateDefinition,
-            options = options,
-            LayoutConfiguration.create(context, 1),
-        )
+        }.compose(context, glanceId, options)
 
         val portraitView = createPortraitContext().applyRemoteViews(rv)
         assertIs<TextView>(portraitView)
@@ -217,30 +156,19 @@
 
     @Config(sdk = [30])
     @Test
-    fun createUiWithResponsiveModePreS() = fakeCoroutineScope.runTest {
+    fun createUiWithResponsiveModePreS() = runTest {
         val sizes = setOf(
             DpSize(60.dp, 80.dp),
             DpSize(100.dp, 70.dp),
             DpSize(120.dp, 100.dp),
         )
-        val composer = TestWidget(SizeMode.Responsive(sizes)) {
-            val size = LocalSize.current
-            Text("${size.width} x ${size.height}")
-        }
         // Note: Landscape fits the 60x80 and 100x70, portrait doesn't fit anything
         val options =
             optionsBundleOf(listOf(DpSize(125.dp, 90.dp), DpSize(40.0.dp, 120.dp)))
-        val appWidgetManager = mock<AppWidgetManager> {
-            on { getAppWidgetInfo(1) }.thenThrow(RuntimeException("This should not be called"))
-        }
-        val rv = composer.compose(
-            context,
-            appWidgetManager,
-            appWidgetId = 1,
-            composer.stateDefinition,
-            options = options,
-            LayoutConfiguration.create(context, 1),
-        )
+        val rv = TestWidget(SizeMode.Responsive(sizes)) {
+            val size = LocalSize.current
+            Text("${size.width} x ${size.height}")
+        }.compose(context, glanceId, options)
 
         val portraitView = createPortraitContext().applyRemoteViews(rv)
         assertIs<TextView>(portraitView)
@@ -254,29 +182,20 @@
     @Test
     fun createUiWithExactMode_noSizeFallsBackToUnique() {
         runBlocking {
-            val composer = TestWidget(SizeMode.Exact) {
+            val appWidgetManager = Shadows.shadowOf(
+                context.getSystemService(Context.APPWIDGET_SERVICE) as AppWidgetManager
+            )
+            appWidgetManager.addBoundWidget(glanceId.appWidgetId, appWidgetProviderInfo {
+                minWidth = 50
+                minHeight = 50
+                minResizeWidth = 40
+                minResizeHeight = 60
+                resizeMode = AppWidgetProviderInfo.RESIZE_BOTH
+            })
+            val rv = TestWidget(SizeMode.Exact) {
                 val size = LocalSize.current
                 Text("${size.width} x ${size.height}")
-            }
-            val appWidgetManager = mock<AppWidgetManager> {
-                on { getAppWidgetInfo(1) }.thenReturn(
-                    appWidgetProviderInfo {
-                        minWidth = 50
-                        minHeight = 50
-                        minResizeWidth = 40
-                        minResizeHeight = 60
-                        resizeMode = AppWidgetProviderInfo.RESIZE_BOTH
-                    }
-                )
-            }
-            val rv = composer.compose(
-                context,
-                appWidgetManager,
-                appWidgetId = 1,
-                composer.stateDefinition,
-                options = Bundle(),
-                LayoutConfiguration.create(context, 1),
-            )
+            }.compose(context, glanceId)
 
             val portraitView = createPortraitContext().applyRemoteViews(rv)
             assertIs<TextView>(portraitView)
@@ -290,27 +209,16 @@
 
     @Config(sdk = [30])
     @Test
-    fun createUiWithResponsiveMode_noSizeUseMinSize() = fakeCoroutineScope.runTest {
+    fun createUiWithResponsiveMode_noSizeUseMinSize() = runTest {
         val sizes = setOf(
             DpSize(60.dp, 80.dp),
             DpSize(100.dp, 70.dp),
             DpSize(120.dp, 100.dp),
         )
-        val composer = TestWidget(SizeMode.Responsive(sizes)) {
+        val rv = TestWidget(SizeMode.Responsive(sizes)) {
             val size = LocalSize.current
             Text("${size.width} x ${size.height}")
-        }
-        val appWidgetManager = mock<AppWidgetManager> {
-            on { getAppWidgetInfo(1) }.thenThrow(RuntimeException("This should not be called"))
-        }
-        val rv = composer.compose(
-            context,
-            appWidgetManager,
-            appWidgetId = 1,
-            composer.stateDefinition,
-            options = Bundle(),
-            LayoutConfiguration.create(context, 1),
-        )
+        }.compose(context, glanceId)
 
         val portraitView = createPortraitContext().applyRemoteViews(rv)
         assertIs<TextView>(portraitView)
@@ -465,9 +373,6 @@
                     provideContentJob.cancel()
                 }
             }
-            override val sessionManager = GlanceSessionManager
-            @Composable
-            override fun Content() { }
         }
         widget.runGlance(context, AppWidgetId(0)).take(2).collectIndexed { index, content ->
             when (index) {
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
index 4927da4..766b3ba 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
@@ -70,7 +70,6 @@
         val applier = Applier(root)
         val recomposer = Recomposer(currentCoroutineContext())
         val composition = Composition(applier, recomposer)
-
         composition.setContent { content() }
 
         launch(TestFrameClock()) { recomposer.runRecomposeAndApplyChanges() }
@@ -176,15 +175,11 @@
 ) : GlanceAppWidget() {
     val provideGlanceCalled = AtomicBoolean(false)
     override suspend fun provideGlance(
-        context: android.content.Context,
-        id: androidx.glance.GlanceId
+        context: Context,
+        id: GlanceId
     ) {
         provideGlanceCalled.set(true)
-        provideContent { Content() }
-    }
-    @Composable
-    override fun Content() {
-        ui()
+        provideContent(ui)
     }
 }
 
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/state/GlanceAppWidgetStateTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/state/GlanceAppWidgetStateTest.kt
index 71531b7..137d09f 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/state/GlanceAppWidgetStateTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/state/GlanceAppWidgetStateTest.kt
@@ -17,28 +17,27 @@
 package androidx.glance.appwidget.state
 
 import android.content.Context
-import androidx.compose.runtime.Composable
 import androidx.datastore.preferences.core.Preferences
 import androidx.datastore.preferences.core.emptyPreferences
 import androidx.datastore.preferences.core.intPreferencesKey
 import androidx.datastore.preferences.core.preferencesOf
+import androidx.glance.GlanceId
 import androidx.glance.appwidget.AppWidgetId
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.createUniqueRemoteUiName
+import androidx.glance.appwidget.provideContent
 import androidx.glance.state.GlanceState
 import androidx.glance.state.GlanceStateDefinition
 import androidx.glance.state.PreferencesGlanceStateDefinition
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.assertFailsWith
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.runBlocking
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(RobolectricTestRunner::class)
 class GlanceAppWidgetStateTest {
 
@@ -91,14 +90,20 @@
     class GlanceAppWidgetProviderWithoutState : GlanceAppWidget() {
         override val stateDefinition: GlanceStateDefinition<*>? = null
 
-        @Composable
-        override fun Content() {
+        override suspend fun provideGlance(
+            context: Context,
+            id: GlanceId
+        ) {
+            provideContent {}
         }
     }
 
     class GlanceAppWidgetProviderPreferencesState : GlanceAppWidget() {
-        @Composable
-        override fun Content() {
+        override suspend fun provideGlance(
+            context: Context,
+            id: GlanceId
+        ) {
+            provideContent {}
         }
     }
 
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/glance/glance/src/androidMain/kotlin/androidx/glance/session/Session.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/session/Session.kt
index 28c7ad1..3c4ecf4 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/session/Session.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/session/Session.kt
@@ -24,8 +24,6 @@
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.channels.ClosedReceiveChannelException
 
-typealias SetContentFn = suspend (@Composable @GlanceComposable () -> Unit) -> Unit
-
 /**
  * [Session] is implemented by Glance surfaces in order to provide content for the
  * composition and process the results of recomposition.
@@ -47,8 +45,7 @@
     abstract fun provideGlance(context: Context): @Composable @GlanceComposable () -> Unit
 
     /**
-     * Process the Emittable tree that results from the running the composable provided by
-     * [provideGlance].
+     * Process the Emittable tree that results from the running [provideGlance].
      *
      * This will also be called for the results of future recompositions.
      * @return true if the tree has been processed and the session is ready to handle events.
@@ -66,9 +63,10 @@
     /**
      * Enqueues an [event] to be processed by the session.
      *
-     * These requests may be processed by calling [receiveEvents].
+     * These requests may be processed by calling [receiveEvents]. Session implementations should
+     * wrap sendEvent with public methods to send the event types that their Session supports.
      */
-    suspend fun sendEvent(event: Any) {
+    protected suspend fun sendEvent(event: Any) {
         eventChannel.send(event)
     }
 
@@ -87,10 +85,7 @@
         }
     }
 
-    suspend fun close() {
+    fun close() {
         eventChannel.close()
-        onClose()
     }
-
-    open suspend fun onClose() {}
 }
diff --git a/glance/glance/src/test/kotlin/androidx/glance/session/SessionManagerImplTest.kt b/glance/glance/src/test/kotlin/androidx/glance/session/SessionManagerImplTest.kt
index 09d5058..3fccf2d 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/session/SessionManagerImplTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/session/SessionManagerImplTest.kt
@@ -38,6 +38,7 @@
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(RobolectricTestRunner::class)
 class SessionManagerImplTest {
     private val key = "KEY"
diff --git a/glance/glance/src/test/kotlin/androidx/glance/session/SessionWorkerTest.kt b/glance/glance/src/test/kotlin/androidx/glance/session/SessionWorkerTest.kt
index 208c6f1..4916033 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/session/SessionWorkerTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/session/SessionWorkerTest.kt
@@ -32,7 +32,6 @@
 import androidx.work.testing.TestListenableWorkerBuilder
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.assertIs
-import kotlin.test.assertNotNull
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.first
@@ -140,7 +139,7 @@
             val text = assertIs<EmittableText>(root.children.single())
             assertThat(text.text).isEqualTo("Hello World")
         }
-        val session = assertNotNull(sessionManager.getSession(SESSION_KEY))
+        val session = assertIs<TestSession>(sessionManager.getSession(SESSION_KEY))
         session.sendEvent {
             state.value = "Hello Earth"
         }
@@ -210,6 +209,8 @@
         return true
     }
 
+    suspend fun sendEvent(block: () -> Unit) = sendEvent(block as Any)
+
     override suspend fun processEvent(context: Context, event: Any) {
         require(event is Function0<*>)
         event.invoke()
diff --git a/gradle.properties b/gradle.properties
index 5868acd..c10ff1a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -6,6 +6,8 @@
 org.gradle.welcome=never
 # Disabled due to https://github.com/gradle/gradle/issues/18626
 # org.gradle.vfs.watch=true
+# Reenabled in gradlew, but disabled in Studio until these errors become shown (b/268380971) or computed more quickly (https://github.com/gradle/gradle/issues/23272)
+org.gradle.dependency.verification=off
 org.gradle.dependency.verification.console=verbose
 org.gradle.unsafe.configuration-cache=true
 org.gradle.unsafe.configuration-cache-problems=warn
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 68d0f3e..3a0ccb7 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"
@@ -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" }
@@ -234,7 +237,7 @@
 reactiveStreams = { module = "org.reactivestreams:reactive-streams", version = "1.0.0" }
 retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
 retrofitConverterWire = { module = "com.squareup.retrofit2:converter-wire", version.ref = "retrofit" }
-robolectric = { module = "org.robolectric:robolectric", version = "4.9-alpha-1" }
+robolectric = { module = "org.robolectric:robolectric", version = "4.9.2" }
 rxjava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.9" }
 rxjava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.0.0" }
 shadow = { module = "gradle.plugin.com.github.johnrengelman:shadow", version = "7.1.1" }
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
index b0c2a94..996388e 100644
--- a/gradle/verification-keyring.keys
+++ b/gradle/verification-keyring.keys
@@ -13602,3 +13602,59 @@
 Pt2uco8an9pO9/oqU6vlZUr38w==
 =alQS
 -----END PGP PUBLIC KEY BLOCK-----
+
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Comment: 10F3 C7A0 2ECA 55E5 02BA  DCF3 991E FB94 DB91 127D
+Comment: Antoine Mottier <antoine.mottier@ow2.org>
+
+xsFNBF6WyHgBEADOrbvGGDYVckFcUofqKiYrBneClFJH1ANheF+KIekmnFV2SH1Z
+RS2rw12IbpCjwqjhFTMWH2UTLF6pAsSGIufTrSVUAF2WxHw84Y60KmwuYayJCVd3
+R91/FaonEcZkH770vNaij8BNnQUOXoyhTsmTw8tpMcVMyCjLn5qKtNVnGsafdi3C
+8VJBTP6x/LjYyv/m0/PgSIX8huzD6m8WzjKyEd9sww0K1sm6C3kF9S1/yQzTu8Hw
+Y22fc5HMNU6IzyUxLPht4BIbvtCIVn1HSfiKv3CUd4B/4z8voc9HJidFzrWxei+W
+uev1h8GSIGQdu7csfsuuFjbpIWuU1OpTRWNr8lFHtGtgQfE4AemSnvXycA/gSlWC
+M5BhTW5w5JuGSo2LBq+YEthjhrBrjkWsOGHiD6TiMvsFPw9UGvhEvzlqeA83sXiX
+KWHvroGUduKyq4/G0c2qCxncCB9IXA+Bbc2je+uSXxY+Phgz3b5XocqOKphTJ6Y5
+dvq8oYWrx4T0Ow/pYWT3n2gJP7BN7raRr2WafQ45fPKNYcE5qTDtLJ/HPPFKdHpP
+jZj8cFKzUw6VPbZwRQi+itJOUQeJ1l4xWvEA2RKgDxDcunO9270RGdSsj/rxNWRS
+mS5He7HuEYdzB8MsO+HrhQgTSTh4gpwgKr6lRhWJTyKH1qk2Q4pT3N4fIQARAQAB
+zSlBbnRvaW5lIE1vdHRpZXIgPGFudG9pbmUubW90dGllckBvdzIub3JnPsLBjgQT
+AQoAOBYhBBDzx6AuylXlArrc85ke+5TbkRJ9BQJelsh4AhsDBQsJCAcCBhUKCQgL
+AgQWAgMBAh4BAheAAAoJEJke+5TbkRJ9R14P/136DcEesh+kVXbIR3CDnN8oQDJl
+1ciqZMS93VNIQ7zY6hPtwVB/JBmWNjBrVCu+1MW8G0W39fGthWW1NtORZHnmna8q
+3yFdaPYDqikJr0DXs5gGM/Bo0K0aVtH4UNA1g9BKhIX/U6wbTkmFhZ/PBAKO6Gtp
+93aFtkCkO5vMu8r0yhig5sbv59FwjMoHaOPIydcfSPiYfYW0bacxBiY4B61XinWI
+dh21K1B3ufkeoyR2Zi4I6DPl0dj0XJzu2Aly+wPdywhD9mbfs2HCDYpZ+eSt5y4m
+FJgV8dXUrBOg+Ghw4iTcf4IFPXhbYwQNqq6MG7v8KCJVbLQwmSMxx1PWKJoSEYqI
+mH0cs306Kspt1+hZyf77KlvuVcwReAuXBc/bHhoR6LXlp+PMzYw8Hb6niewQIAx/
+oBYPdVN51tI/gRDNwDzpd12iWAC7XGr9CwEEmMUCKRiRGHOkzEeWUI6jZB+XwaH1
+oXC6k1vzMEWdF8T06D4GXX/TbM9a1/dCHNAx3hKhlkbFpTnAfkdCOLl53V9jarva
+QygfpbM0NI58/dgvcxlnf4JSfIf2V7ll+/nW5Ekt/grmihfgETxbIykqW4UqjS+k
+JFhqpSS+ey6GyRK4TF2TavdMC2X5X/uCpw+YvfouNDnTnUn80mxhxlZu9lxDUNgD
+jClweeOYOaZitvVXzsFNBF6WyHgBEADX15qJoH8yYoVJHhzNi41oHophSQ371uaB
+KTtY6GxNUFeGJWmTkBMKz4WvAiA2BIcYHwb0ZGIzEkwqKOJ+d6ZM/kOM5h8m198E
+SFKLk6RXgL0yqcE6y89IRUEuBtsnbkkR2IIrC83Aa1jMHb5oRitckVCGkzZEY6S4
+icqrpEseYW7VZrDbgCYfbT6zmZrTlThBdkAAefbxSGSfrKZc6FAyvHGzTfwbNmnd
+jXt+IBokmQEFo4lMx5qIqSRT6umU5icE3zfZXTx7jpuzUjuN9pGugIJolOfk7jVo
+rkIbvm3KnZPPmyFBaRyeIRzNdcqXLW8a5cuTgKCJWkdUblcHuKUfcRUMERTyQqk/
+STdm3SGcjU+LtMzK8ii5ZouixnFc4JQlrYsvTeNYKB1V7xFUcogbjB+bGNQ/OVKz
+aVJh5fkfCf2JKqjssjlbplDw2HEvkPv9T4m20pdt8LgIcBk1hKdWEPaeHP1hVGeD
+7WxJuDTBdE0dvrN5nk5womgLT+om2VC7qoC3tOoJ5GIps+Jcqh+03rolZI89iK7M
+2KW3h+OdY9fTS4fCNdvS9H19sroZ4G3S4TM4FMB8CqaOEdigbM+qHIndwwWTWowj
+TqfvbEECUNiRyK8/yhd8wgrUP1X9S0T3SV5b4H4VysN/rroPssBmv0q/SBTM45L7
+NnB8laTzcwARAQABwsF2BBgBCgAgFiEEEPPHoC7KVeUCutzzmR77lNuREn0FAl6W
+yHgCGwwACgkQmR77lNuREn0TmQ/+NO2IdVVCWAza3ONRb05cQfgWHZLr62J4jrOo
+aKNOvgkln6wcqbBXTczCBzQzjOPenaPDcCBApBt12ji6SxcUgLzjncnFgaNCQswN
+O8Z1UbY/n26DPb7tTxY97aN7BrDPTBlsv78SmTOrr2B3XlZ43D5SFpiSjhRRYbq+
+7ozhhE+ETXBVRf7j/MfbakJOYlfPZr29YwOYqKmXsNhIKK0Kf8TeQApd57dBNj1k
+JjM9Yqp/KxlwWNVjKYGo/eNIYy9hojK6gWLSKahED0fAjc0AZjoQmuQeJEIUyQDk
+CkVM4TACtVNq6P0TWGg35YexaJyQ7ddR2kMuHn1pI9qpgjzYjLTFnUkDf4vfD37r
+rlQ6hYngplPx9PJQM3ZZOdr63axYByMcUc8fHx0KHI85bCGGHZBzGyAyqmOgbAYI
+QixlIXbeZwLdvq3QlCy4oRH/rEjItt50dLVOblNyYnLO2HixgqUwtkMcHmv/ZDtH
+HeiFnzii6+FJQyVqwDYyT02odqde4TtSoCUuTqJg0z91l0b7O3Rl+t55C18qSVWE
+wvzFWug3eOWzCtscY4U/M44XPJaSUXF/vBMrtKeB5solOOb5T4HjNyDBwxFRYZm9
+w18S9Qb4LCdWzXZVRRLbIjKV3a1qR958Ad+iiQ5vQdsEfto6IjHgPQaAaqZi2OZ7
+zXFYXic=
+=YKsx
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index afcc410..c6925ea 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -1,39 +1,39 @@
 <?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"/>
-         <trusted-key id="012579464d01c06a" group="org.apache"/>
+         <trusted-key id="fa77dcfef2ee6eb2debedd2c012579464d01c06a" group="org.apache"/>
          <trusted-key id="019082bc00e0324e2aef4cf00d3b328562a119a7" group="org.openjdk.jmh"/>
-         <trusted-key id="02216ed811210daa" group="io.github.detekt.sarif4k"/>
-         <trusted-key id="0315bfb7970a144f">
+         <trusted-key id="8569c95cadc508b09fe90f3002216ed811210daa" group="io.github.detekt.sarif4k"/>
+         <trusted-key id="70cd19bfd9f6c330027d6f260315bfb7970a144f">
             <trusting group="com.sun.istack"/>
             <trusting group="com.sun.xml.bind.mvn"/>
             <trusting group="com.sun.xml.fastinfoset"/>
@@ -41,7 +41,7 @@
             <trusting group="org.glassfish.jaxb"/>
             <trusting group="org.jvnet.staxex"/>
          </trusted-key>
-         <trusted-key id="0374cf2e8dd1bdfd" group="org.sonatype.oss"/>
+         <trusted-key id="2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd" group="org.sonatype.oss"/>
          <trusted-key id="042b29e928995b9db963c636c7ca19b7b620d787" group="org.apache.maven" name="maven-ant-tasks"/>
          <trusted-key id="04543577d6a9cc626239c50c7ecbd740ff06aeb5">
             <trusting group="com.sun.activation"/>
@@ -55,17 +55,18 @@
          <trusted-key id="06a228aab83a18a8df7b84b08614d6ab265b4c63" group="org.apache.ant"/>
          <trusted-key id="0785b3eff60b1b1bea94e0bb7c25280eae63ebe5" group="org.apache.httpcomponents"/>
          <trusted-key id="08f0aab4d0c1a4bdde340765b341ddb020fcb6ab" group="org.bouncycastle"/>
-         <trusted-key id="09a79e1e15a04694" group="org.vafer"/>
+         <trusted-key id="79156e0351af8604de9b186b09a79e1e15a04694" group="org.vafer"/>
          <trusted-key id="0cc641c3a62453ab390066c4a41f13c999945293" group="commons-logging"/>
          <trusted-key id="0d35d3f60078655126908e8af3d1600878e85a3d" group="io.netty"/>
          <trusted-key id="0d5d634755737a19abbe2930d4da5eab3cd7e958" group="com.google.devtools.ksp"/>
          <trusted-key id="0d8f8561aa7a5dd20bae27043c0a8f4744f37328" group="com.github.ben-manes.caffeine" name="caffeine"/>
-         <trusted-key id="0e91c2de43b72bb1" group="org.ec4j.core"/>
+         <trusted-key id="2e92113263fc31c74ccbaab20e91c2de43b72bb1" group="org.ec4j.core"/>
          <trusted-key id="0eb9d7c468f97e44051d650ad73c68ee4152c255" group="com.google.dagger"/>
          <trusted-key id="0f07d1201bddab67cfb84eb479752db6c966f0b8" group="com.google.android"/>
-         <trusted-key id="10066a9707090cf9" group="org.javassist"/>
-         <trusted-key id="10ae8966a146e8be" group="com.google.crypto.tink"/>
-         <trusted-key id="1188b69f6d6259ca" group="com.google.accompanist"/>
+         <trusted-key id="666a4692ce11b7b3f4eb7b3410066a9707090cf9" group="org.javassist"/>
+         <trusted-key id="c8741082ff1b0ee96bcabeec10ae8966a146e8be" group="com.google.crypto.tink"/>
+         <trusted-key id="10f3c7a02eca55e502badcf3991efb94db91127d" group="org.ow2"/>
+         <trusted-key id="64b9b09f164aa0bf88742eb61188b69f6d6259ca" group="com.google.accompanist"/>
          <trusted-key id="11b581967f079a30a3e93140d57506cd188fd842" group="com.google.api.grpc"/>
          <trusted-key id="120d6f34e627ed3a772ebbfe55c7e5e701832382">
             <trusting group="org.snakeyaml"/>
@@ -77,11 +78,11 @@
          <trusted-key id="151ba00a46886a5f95441a0f5d67bffcba1f9a39" group="com.google.gradle" name="osdetector-gradle-plugin"/>
          <trusted-key id="1597ab231b7add7e14b1d9c43f00db67ae236e2e" group="org.conscrypt"/>
          <trusted-key id="160a7a9cf46221a56b06ad64461a804f2609fd89" group="com.github.shyiko.klob" name="klob"/>
-         <trusted-key id="1861c322c56014b2" group="commons-lang"/>
+         <trusted-key id="d196a5e3e70732eeb2e5007f1861c322c56014b2" group="commons-lang"/>
          <trusted-key id="187366a3ffe6bf8f94b9136a9987b20c8f6a3064" group="com.google.protobuf"/>
          <trusted-key id="190d5a957ff22273e601f7a7c92c5fec70161c62" group="org.codehaus.mojo"/>
          <trusted-key id="19beab2d799c020f17c69126b16698a4adf4d638" group="org.checkerframework"/>
-         <trusted-key id="1b2718089ce964b8" group="com.thoughtworks.qdox"/>
+         <trusted-key id="31fae244a81d64507b47182e1b2718089ce964b8" group="com.thoughtworks.qdox"/>
          <trusted-key id="1bc86444bbd2a24c3a40904a438e9634a2319637" group="co.nstant.in" name="cbor"/>
          <trusted-key id="1cb7a3dbc99b562d69bfdfedae7af7ae095eb290" group="net.saff.checkmark"/>
          <trusted-key id="1d0a8b5e77c678a7c724445abf984b4145ea13f7" group="com.squareup"/>
@@ -95,17 +96,17 @@
             <trusting group="com.google.protobuf" name="protobuf-gradle-plugin"/>
          </trusted-key>
          <trusted-key id="1f47744c9b6e14f2049c2857f1f111af65925306" group="io.github.classgraph" name="classgraph"/>
-         <trusted-key id="1f8cf885d537a431" group="com.nhaarman.mockitokotlin2"/>
+         <trusted-key id="5dceb296690bd5101756f2441f8cf885d537a431" group="com.nhaarman.mockitokotlin2"/>
          <trusted-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" group="de.undercouch"/>
-         <trusted-key id="205c8673dc742c7c" group="org.apache"/>
+         <trusted-key id="da7a1bb85b19e4fb05073431205c8673dc742c7c" group="org.apache"/>
          <trusted-key id="20723a6399bc060154283b37cfae163b64ac9189" group="org.jetbrains.skiko"/>
-         <trusted-key id="21200d723f53ce38" group="com.squareup.leakcanary"/>
-         <trusted-key id="218fa0f6a941a037" group="com.github.kevinstern"/>
-         <trusted-key id="21939ff0ca2a6567" group="commons-codec"/>
-         <trusted-key id="21a24b3f8b0f594a" group="org.apache"/>
+         <trusted-key id="b9cca13c59f21c6ce841a8d1a4b1a03fb9c2ce23" group="com.squareup.leakcanary"/>
+         <trusted-key id="a4fd709cc4b0515f2e6af04e218fa0f6a941a037" group="com.github.kevinstern"/>
+         <trusted-key id="bc87a3fd0a54480f0badbebd21939ff0ca2a6567" group="commons-codec"/>
+         <trusted-key id="0cde80149711eb46dff17ae421a24b3f8b0f594a" group="org.apache"/>
          <trusted-key id="22b79f456b06f4e75b8b579db57bd58ef6d0a713" group="com.google.protobuf" name="protoc"/>
-         <trusted-key id="22e44ac0622b91c3" group="com.beust"/>
-         <trusted-key id="2383163bc40844fd" group="org.reactivestreams"/>
+         <trusted-key id="c70b844f002f21f6d2b9c87522e44ac0622b91c3" group="com.beust"/>
+         <trusted-key id="a5b2dde7843e7ca3e8caabd02383163bc40844fd" group="org.reactivestreams"/>
          <trusted-key id="24d04176586361fda94ee0315f7786df73e61f56" group="com.google.devtools.ksp"/>
          <trusted-key id="26063b04869f7d235ccc057447586a1b75ef0de5" group="com.squareup.wire"/>
          <trusted-key id="263923711ef4fe3f3f0c28af11509ed50ec155e6" group="org.reactivestreams"/>
@@ -115,19 +116,19 @@
             <trusting group="net.java"/>
             <trusting group="org.codehaus"/>
          </trusted-key>
-         <trusted-key id="2be5d98f751f4136" group="org.pcollections"/>
+         <trusted-key id="908366594e746bf3c449f5622be5d98f751f4136" group="org.pcollections"/>
          <trusted-key id="2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb">
             <trusting group="commons-codec"/>
             <trusting group="commons-io"/>
             <trusting group="org.apache.commons"/>
             <trusting group="xml-apis"/>
          </trusted-key>
-         <trusted-key id="2e2010f8a7ff4a41" group="org.apache"/>
+         <trusted-key id="ba926f64ca647b6d853a38672e2010f8a7ff4a41" group="org.apache"/>
          <trusted-key id="2e3a1affe42b5f53af19f780bcf4173966770193" group="org.jetbrains"/>
          <trusted-key id="2e92113263fc31c74ccbaab20e91c2de43b72bb1" group="org.ec4j.core"/>
-         <trusted-key id="2f566d4221d3ec52" group="com.ryanharter.auto.value"/>
+         <trusted-key id="32b92f2ff75fdf37dc811c3c2f566d4221d3ec52" group="com.ryanharter.auto.value"/>
          <trusted-key id="3051d45031e13516a6e8faff280d66a55f5316c5" group="org.bitbucket.b_c"/>
-         <trusted-key id="30e6f80434a72a7f">
+         <trusted-key id="9ffed7a118d45a44e4a1e47130e6f80434a72a7f">
             <trusting group="org.apache.maven"/>
             <trusting group="org.apache.maven.wagon"/>
          </trusted-key>
@@ -141,27 +142,27 @@
          <trusted-key id="32b92f2ff75fdf37dc811c3c2f566d4221d3ec52" group="com.ryanharter.auto.value"/>
          <trusted-key id="33fd4bfd33554634053d73c0c2148900bcd3c2af" group="org.jetbrains.trove4j" name="trove4j"/>
          <trusted-key id="34441e504a937f43eb0daef96a65176a0fb1cd0b" group="org.codehaus.groovy"/>
-         <trusted-key id="353a436e043e3145" group="com.google.code.findbugs"/>
+         <trusted-key id="3dbc5d7dc2fb8dd68aa429bd353a436e043e3145" group="com.google.code.findbugs"/>
          <trusted-key id="3872ed7d5904493d23d78fa2c4c8cb73b1435348" group="com.android.tools.build"/>
-         <trusted-key id="3ad93c3c677a106e" group="io.perfmark"/>
-         <trusted-key id="3c0a8f4744f37328" group="com.github.ben-manes.caffeine"/>
-         <trusted-key id="3c27d97b0c83a85c" group="com.google.errorprone"/>
+         <trusted-key id="c6f7d1c804c821f49af3bfc13ad93c3c677a106e" group="io.perfmark"/>
+         <trusted-key id="0d8f8561aa7a5dd20bae27043c0a8f4744f37328" group="com.github.ben-manes.caffeine"/>
+         <trusted-key id="6f656b7f6bfb238d38acf81f3c27d97b0c83a85c" group="com.google.errorprone"/>
          <trusted-key id="3d11126ea77e4e07fbabb38614a84c976d265b25" group="com.google.protobuf"/>
          <trusted-key id="3dbc5d7dc2fb8dd68aa429bd353a436e043e3145" group="com.google.code.findbugs"/>
          <trusted-key id="3eb3846b3dc004c13883753ceef9ecc7d5d90518" group="com.google.dagger"/>
-         <trusted-key id="3f36885c24df4b75" group="org.mozilla"/>
-         <trusted-key id="3faad2cd5ecbb314" group="org.apache.commons"/>
-         <trusted-key id="41321490758aad6f" group="org.codehaus.groovy"/>
+         <trusted-key id="ea0b70b5050192c98cfa7e4f3f36885c24df4b75" group="org.mozilla"/>
+         <trusted-key id="b6e73d84ea4fcc47166087253faad2cd5ecbb314" group="org.apache.commons"/>
+         <trusted-key id="7faa0f2206de228f0db01ad741321490758aad6f" group="org.codehaus.groovy"/>
          <trusted-key id="41a1a08c62fca78b79d3081164a16faaec16a4be" group="org.apache.commons" name="commons-math3"/>
          <trusted-key id="41cd49b4ef5876f9e9f691dabac30622339994c4">
             <trusting group="com.google.testing.compile"/>
             <trusting group="com.google.truth"/>
          </trusted-key>
-         <trusted-key id="42575e0ccd6ba16a" group="org.xerial"/>
-         <trusted-key id="429c8816dea04cdb" group="org.xerial"/>
-         <trusted-key id="438e9634a2319637" group="co.nstant.in"/>
-         <trusted-key id="44ce7bf2825ea2cd" group="com.ibm.icu"/>
-         <trusted-key id="461a804f2609fd89" group="com.github.shyiko.klob"/>
+         <trusted-key id="88cd390855df292e2172da9742575e0ccd6ba16a " group="org.xerial"/>
+         <trusted-key id="56b505dc8a29c69138a430b9429c8816dea04cdb" group="org.xerial"/>
+         <trusted-key id="1bc86444bbd2a24c3a40904a438e9634a2319637" group="co.nstant.in"/>
+         <trusted-key id="cb3190ca7842439e57f3712e44ce7bf2825ea2cd" group="com.ibm.icu"/>
+         <trusted-key id="160a7a9cf46221a56b06ad64461a804f2609fd89" group="com.github.shyiko.klob"/>
          <trusted-key id="47504b76cf89c15c0512d9afe16ab52d79fd224f">
             <trusting group="com.google.api"/>
             <trusting group="com.google.api-client"/>
@@ -172,21 +173,21 @@
             <trusting group="com.google.http-client"/>
             <trusting group="com.google.oauth-client"/>
          </trusted-key>
-         <trusted-key id="47586a1b75ef0de5" group="com.squareup.wire"/>
+         <trusted-key id="26063b04869f7d235ccc057447586a1b75ef0de5" group="com.squareup.wire"/>
          <trusted-key id="475f3b8e59e6e63aa78067482c7b12f2a511e325">
             <trusting group="ch.qos.logback"/>
             <trusting group="org.slf4j"/>
          </trusted-key>
-         <trusted-key id="476634a4694e716a" group="com.googlecode.java-diff-utils"/>
+         <trusted-key id="b47034c19c9b1f3dc3702f8d476634a4694e716a" group="com.googlecode.java-diff-utils"/>
          <trusted-key id="4791825bdea86eb9286a2ace88bb19a33a18445f" group="net.ltgt.gradle.incap"/>
          <trusted-key id="47bf592261cd1a8a69b703b4e0cb7823cfd00fbf">
             <trusting group="com.jakewharton.dex"/>
             <trusting group="com.squareup.retrofit2"/>
             <trusting group="^com[.]jakewharton($|([.].*))" regex="true"/>
          </trusted-key>
-         <trusted-key id="47dcfc2a59f59b5b" group="io.outfoxx"/>
+         <trusted-key id="78ab011fa6e5907950ea3e2747dcfc2a59f59b5b" group="io.outfoxx"/>
          <trusted-key id="47eb6836245d2d40e89dfb4136d4e9618f3adab5" group="io.github.microutils" name="kotlin-logging-jvm"/>
-         <trusted-key id="4896f7312a5ace4d">
+         <trusted-key id="c888b9955815ea83b48531784896f7312a5ace4d">
             <trusting group="com.google.gradle"/>
             <trusting group="com.google.protobuf"/>
          </trusted-key>
@@ -202,20 +203,20 @@
          <trusted-key id="4f8fec6785f611d9a712ea2734918b7d3969d2f5" group="com.google.dagger"/>
          <trusted-key id="517b94f8d0a46317a28d8ab30da8a5ec02d11ead" group="net.sf.jopt-simple"/>
          <trusted-key id="51b52dc5dd452f92be342cc2858fc4c4f43856a3" group="xerces"/>
-         <trusted-key id="5208812e1e4a6db0" group="com.gradle"/>
-         <trusted-key id="55c7e5e701832382" group="org.snakeyaml"/>
+         <trusted-key id="314fe82e5a4c5377bca2edec5208812e1e4a6db0" group="com.gradle"/>
+         <trusted-key id="120d6f34e627ed3a772ebbfe55c7e5e701832382" group="org.snakeyaml"/>
          <trusted-key id="56b505dc8a29c69138a430b9429c8816dea04cdb" group="org.xerial" name="sqlite-jdbc"/>
          <trusted-key id="5719e50eac5a4b1dd390b72c2a742740e08e7f8d" group="org.antlr"/>
-         <trusted-key id="571a5291e827e1c7" group="net.java"/>
+         <trusted-key id="e82d2eaf2e83830ce1f7f6be571a5291e827e1c7" group="net.java"/>
          <trusted-key id="5767f9cde920750621875079a40e24b5b408dbd5" group="org.robolectric"/>
-         <trusted-key id="586654072ead6677" group="org.sonatype.oss"/>
+         <trusted-key id="44fbdbbc1a00fe414f1c1873586654072ead6677" group="org.sonatype.oss"/>
          <trusted-key id="5897253bea3046aeea95a067e93671c7272b7b3f" group="org.jdom"/>
          <trusted-key id="5ce325996a35213326ae2c68912d2c0eccda55c0" group="com.google.errorprone"/>
-         <trusted-key id="5d67bffcba1f9a39" group="com.google.gradle"/>
+         <trusted-key id="51ba00a46886a5f95441a0f5d67bffcba1f9a39" group="com.google.gradle"/>
          <trusted-key id="5dceb296690bd5101756f2441f8cf885d537a431" group="com.nhaarman.mockitokotlin2" name="mockito-kotlin"/>
-         <trusted-key id="5e1f79a7c298661e" group="com.google.auto.value"/>
-         <trusted-key id="5ed22f661bbf0acc" group="com.almworks.sqlite4java"/>
-         <trusted-key id="5f7786df73e61f56" group="com.google.devtools.ksp"/>
+         <trusted-key id="6f7e5acbcd02db60dfd232e45e1f79a7c298661e" group="com.google.auto.value"/>
+         <trusted-key id="2bab4466b44f54f8f99bbbdd5ed22f661bbf0acc" group="com.almworks.sqlite4java"/>
+         <trusted-key id="24d04176586361fda94ee0315f7786df73e61f56" group="com.google.devtools.ksp"/>
          <trusted-key id="5fa41c402006eac55d72aafd99ce9d9f22dc5c99" group="org.json"/>
          <trusted-key id="600ea202b1ec682f4a788e5aac7a514bc9f9bb70" group="io.opencensus"/>
          <trusted-key id="6214760097dc5cfad0175ac2c9fbaa83a8753994">
@@ -228,13 +229,13 @@
             <trusting group="org.codehaus.woodstox"/>
          </trusted-key>
          <trusted-key id="628462a5eaba59d57e99ae5a840b2bf6da8ed8c8" group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework"/>
-         <trusted-key id="62ba9c275d14234e">
+         <trusted-key id="04e9b2e1f06ecbbe0ed0aac562ba9c275d14234e">
             <trusting group="com.squareup.curtains"/>
             <trusting group="com.squareup.leakcanary"/>
          </trusted-key>
-         <trusted-key id="62c82e50836eb3ee" group="com.github.gundy"/>
+         <trusted-key id="55e770230e69cc6de143fb5b62c82e50836eb3ee" group="com.github.gundy"/>
          <trusted-key id="635ee627345f3c1dd422b2e207d3516820bcf6b1" group="com.github.ben-manes.caffeine"/>
-         <trusted-key id="6525fd70cc303655" group="org.codehaus.mojo"/>
+         <trusted-key id="82f833963889d7ed06f1e4dc6525fd70cc303655" group="org.codehaus.mojo"/>
          <trusted-key id="666a4692ce11b7b3f4eb7b3410066a9707090cf9" group="org.javassist" name="javassist"/>
          <trusted-key id="682f765eea718d250bbdb2f1685c46769dbb5e5d" group="com.squareup" name="kotlinpoet"/>
          <trusted-key id="694621a7227d8d5289699830abe9f3126bb741c1">
@@ -243,13 +244,13 @@
             <trusting group="^com[.]google($|([.].*))" regex="true"/>
          </trusted-key>
          <trusted-key id="696b6199a2a9d8c29ce78cc0d041cad2e452550f" group="com.google.protobuf"/>
-         <trusted-key id="6a65176a0fb1cd0b" group="org.codehaus.groovy"/>
-         <trusted-key id="6ccc36cc6c69fc17" group="com.google"/>
+         <trusted-key id="34441e504a937f43eb0daef96a65176a0fb1cd0b" group="org.codehaus.groovy"/>
+         <trusted-key id="ec86f41279f2ec8ffd2f54906ccc36cc6c69fc17" group="com.google"/>
          <trusted-key id="6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac">
             <trusting group="com.sun.activation"/>
             <trusting group="jakarta.activation"/>
          </trusted-key>
-         <trusted-key id="6eff5ef5523052d4" group="com.github.tschuchortdev"/>
+         <trusted-key id="2a4f55d9cda5877731fbe7466eff5ef5523052d4" group="com.github.tschuchortdev"/>
          <trusted-key id="6f538074ccebf35f28af9b066a0975f8b1127b83">
             <trusting group="org.jetbrains.kotlin"/>
             <trusting group="org.jetbrains.kotlin.jvm"/>
@@ -269,15 +270,15 @@
             <trusting group="org.jvnet.staxex"/>
             <trusting group="^com[.]sun($|([.].*))" regex="true"/>
          </trusted-key>
-         <trusted-key id="72385ff0af338d52" group="org.threeten"/>
+         <trusted-key id="b41089a2da79b0fa5810252872385ff0af338d52" group="org.threeten"/>
          <trusted-key id="7615ad56144df2376f49d98b1669c4bb543e0445" group="com.google.errorprone"/>
          <trusted-key id="7616eb882daf57a11477aaf559a252fb1199d873" group="com.google.code.findbugs"/>
          <trusted-key id="78ab011fa6e5907950ea3e2747dcfc2a59f59b5b" group="io.outfoxx"/>
          <trusted-key id="79156e0351af8604de9b186b09a79e1e15a04694" group="org.vafer" name="jdependency"/>
-         <trusted-key id="7999befba1039e8b" group="net.bytebuddy"/>
-         <trusted-key id="7a8860944fad5f62" group="org.apache.commons"/>
+         <trusted-key id="b4ac8cdc141af0ae468d16921da784ccb5c46dd5" group="net.bytebuddy"/>
+         <trusted-key id="d6f1bc78607808ec8e9f69437a8860944fad5f62" group="org.apache.commons"/>
          <trusted-key id="7c669810892cbd3148fa92995b05ccde140c2876" group="org.eclipse.jgit"/>
-         <trusted-key id="7c7d8456294423ba" group="org.objenesis"/>
+         <trusted-key id="e85aed155021af8a6c6b7a4a7c7d8456294423ba" group="org.objenesis"/>
          <trusted-key id="7cb548acfe3d47e92afa566dc29b11246382a4d7" group="com.charleskorn.kaml"/>
          <trusted-key id="7cd52b5a8295137c88fb5748dddafa7674e54418" group="org.testng" name="testng"/>
          <trusted-key id="7e22d50a7ebd9d2cd269b2d4056aca74d46000bf" group="io.netty"/>
@@ -285,14 +286,14 @@
          <trusted-key id="7faa0f2206de228f0db01ad741321490758aad6f" group="org.codehaus.groovy"/>
          <trusted-key id="80f6d6b0d90c6747753344cab5a9e81b565e89e0" group="org.tomlj" name="tomlj"/>
          <trusted-key id="8254180bfc943b816e0b5e2e5e2f2b3d474efe6b" group="it.unimi.dsi"/>
-         <trusted-key id="82b5574242c20d6f" group="org.antlr"/>
+         <trusted-key id="842afb86375d805422835bfd82b5574242c20d6f" group="org.antlr"/>
          <trusted-key id="82f833963889d7ed06f1e4dc6525fd70cc303655" group="org.codehaus.mojo"/>
          <trusted-key id="835a685c8c6f49c54980e5caf406f31bc1468eba" group="org.jcodec"/>
-         <trusted-key id="840b2bf6da8ed8c8" group="com.google.android.apps.common.testing.accessibility.framework"/>
+         <trusted-key id="628462a5eaba59d57e99ae5a840b2bf6da8ed8c8" group="com.google.android.apps.common.testing.accessibility.framework"/>
          <trusted-key id="842afb86375d805422835bfd82b5574242c20d6f" group="org.antlr"/>
          <trusted-key id="8569c95cadc508b09fe90f3002216ed811210daa" group="io.github.detekt.sarif4k" name="sarif4k"/>
-         <trusted-key id="85911f425ec61b51" group="org.junit"/>
-         <trusted-key id="8614d6ab265b4c63" group="org.apache.ant"/>
+         <trusted-key id="ff6e2c001948c5f2f38b0cc385911f425ec61b51" group="org.junit"/>
+         <trusted-key id="06a228aab83a18a8df7b84b08614d6ab265b4c63" group="org.apache.ant"/>
          <trusted-key id="8756c4f765c9ac3cb6b85d62379ce192d401ab61">
             <trusting group="com.github.ajalt"/>
             <trusting group="com.github.javaparser"/>
@@ -301,7 +302,7 @@
             <trusting group="^org[.]jetbrains($|([.].*))" regex="true"/>
          </trusted-key>
          <trusted-key id="8858d45be9b276802318155b96fb9db219f3338d" group="kr.motd.maven"/>
-         <trusted-key id="88bb19a33a18445f" group="net.ltgt.gradle.incap"/>
+         <trusted-key id="4791825bdea86eb9286a2ace88bb19a33a18445f" group="net.ltgt.gradle.incap"/>
          <trusted-key id="8a10792983023d5d14c93b488d7f1bec1e2ecae7">
             <trusting group="com.fasterxml"/>
             <trusting group="com.fasterxml.jackson"/>
@@ -317,25 +318,25 @@
             <trusting group="com.squareup" name="javawriter"/>
          </trusted-key>
          <trusted-key id="95115197c5227c0887299d000f9fe62f88e938d8" group="com.google.dagger"/>
-         <trusted-key id="95c15058a5eda4f1" group="com.google.protobuf"/>
-         <trusted-key id="96fb9db219f3338d" group="kr.motd.maven"/>
-         <trusted-key id="971b04f56669b805" group="com.google.jsilver"/>
+         <trusted-key id="1dbb44e80f61493d6369b5fb95c15058a5eda4f1" group="com.google.protobuf"/>
+         <trusted-key id="8858d45be9b276802318155b96fb9db219f3338d" group="kr.motd.maven"/>
+         <trusted-key id="b252e5789636134a311e4463971b04f56669b805" group="com.google.jsilver"/>
          <trusted-key id="98465301a4939c0279f2e847d89d05374952262b" group="org.jetbrains.dokka"/>
-         <trusted-key id="995efbf4a3d20beb">
+         <trusted-key id="adbc987d1a7b91db6b0aaa81995efbf4a3d20beb">
             <trusting group="com.pinterest"/>
             <trusting group="com.pinterest.ktlint"/>
          </trusted-key>
          <trusted-key id="998af0e2b935996f5cebd56b9b1fda9f3c062231" group="org.apache.maven"/>
-         <trusted-key id="9a259c7ee636c5ed" group="com.google.errorprone"/>
-         <trusted-key id="9b1fda9f3c062231" group="org.apache"/>
+         <trusted-key id="e77417ac194160a3fabd04969a259c7ee636c5ed" group="com.google.errorprone"/>
+         <trusted-key id="998af0e2b935996f5cebd56b9b1fda9f3c062231" group="org.apache"/>
          <trusted-key id="9bbc1c3e408ca09cf76d1a029c538d5a79281639" group="com.squareup.sqldelight"/>
-         <trusted-key id="9c4f7e9d98b1cc53" group="org.apache"/>
-         <trusted-key id="9c538d5a79281639" group="com.squareup.sqldelight"/>
+         <trusted-key id="6bdaca2c0493cca133b372d09c4f7e9d98b1cc53" group="org.apache"/>
+         <trusted-key id="9bbc1c3e408ca09cf76d1a029c538d5a79281639" group="com.squareup.sqldelight"/>
          <trusted-key id="9d0a56aaa0d60e0c0c7dccc0b4c70893b62babe8">
             <trusting group="org.apache.logging"/>
             <trusting group="org.apache.logging.log4j"/>
          </trusted-key>
-         <trusted-key id="9daadc1c9fcc82d0" group="commons-cli"/>
+         <trusted-key id="cd5464315f0b98c77e6e8ecd9daadc1c9fcc82d0" group="commons-cli"/>
          <trusted-key id="9e84765a7aa3e3d3d5598a408e3f0de7ae354651">
             <trusting group="com.google.code.gson"/>
             <trusting group="com.squareup"/>
@@ -343,9 +344,9 @@
          </trusted-key>
          <trusted-key id="9ffed7a118d45a44e4a1e47130e6f80434a72a7f" group="^org[.]apache[.]maven($|([.].*))" regex="true"/>
          <trusted-key id="a0e7010544c02bd4c072b1803e3d777c909a447c" group="io.opencensus"/>
-         <trusted-key id="a1b4460d8ba7b9af" group="org.mockito"/>
+         <trusted-key id="cc4483cd6a3eb2939b948667a1b4460d8ba7b9af" group="org.mockito"/>
          <trusted-key id="a33a0b49a4c1ab590b0a4ddc1364c5e2df3e99c5" group="org.reactivestreams"/>
-         <trusted-key id="a40e24b5b408dbd5" group="org.robolectric"/>
+         <trusted-key id="5767f9cde920750621875079a40e24b5b408dbd5" group="org.robolectric"/>
          <trusted-key id="a413f67d71beec23add0ce0acb43338e060cf9fa">
             <trusting group="com.google.code.findbugs" name="jsr305"/>
             <trusting group="org.jacoco"/>
@@ -353,14 +354,14 @@
          <trusted-key id="a4fd709cc4b0515f2e6af04e218fa0f6a941a037" group="com.github.kevinstern" name="software-and-algorithms"/>
          <trusted-key id="a5b2dde7843e7ca3e8caabd02383163bc40844fd" group="org.reactivestreams" name="reactive-streams"/>
          <trusted-key id="a5bd02b93e7a40482eb1d66a5f69ad087600b22c" group="org.ow2.asm"/>
-         <trusted-key id="a6adfc93ef34893e" group="org.hamcrest"/>
+         <trusted-key id="4db1a49729b053caf015cee9a6adfc93ef34893e" group="org.hamcrest"/>
          <trusted-key id="a6d6c97108b8585f91b158748671a8df71296252" group="^com[.]squareup($|([.].*))" regex="true"/>
-         <trusted-key id="a730529ca355a63e" group="org.ccil.cowan.tagsoup"/>
-         <trusted-key id="a7764f502a938c99" group="com.google.protobuf"/>
+         <trusted-key id="eaa526b91dd83ba3e1b9636fa730529ca355a63e" group="org.ccil.cowan.tagsoup"/>
+         <trusted-key id="d75e25b78ebb19e47c0a99bca7764f502a938c99" group="com.google.protobuf"/>
          <trusted-key id="a7892505cf1a58076453e52d7999befba1039e8b" group="net.bytebuddy"/>
          <trusted-key id="aa417737bd805456db3cbdde6601e5c08dccbb96" group="info.picocli" name="picocli"/>
          <trusted-key id="aa70c7c433d501636392ec02153e7a3c2b4e5118" group="org.eclipse.ee4j"/>
-         <trusted-key id="ac5ec74981f9cda6">
+         <trusted-key id="dcba03381ef6c89096acd985ac5ec74981f9cda6">
             <trusting group="com.beust"/>
             <trusting group="org.testng"/>
          </trusted-key>
@@ -375,29 +376,29 @@
             <trusting group="org.threeten" name="threetenbp"/>
          </trusted-key>
          <trusted-key id="b47034c19c9b1f3dc3702f8d476634a4694e716a" group="com.googlecode.java-diff-utils" name="diffutils"/>
-         <trusted-key id="b4c70893b62babe8" group="org.apache.logging.log4j"/>
-         <trusted-key id="b57bd58ef6d0a713" group="com.google.protobuf"/>
-         <trusted-key id="b5a9e81b565e89e0" group="org.tomlj"/>
+         <trusted-key id="748f15b2cf9ba8f024155e6ed7c92b70fa1c814d" group="org.apache.logging.log4j"/>
+         <trusted-key id="22b79f456b06f4e75b8b579db57bd58ef6d0a713" group="com.google.protobuf"/>
+         <trusted-key id="80f6d6b0d90c6747753344cab5a9e81b565e89e0" group="org.tomlj"/>
          <trusted-key id="b6e73d84ea4fcc47166087253faad2cd5ecbb314" group="org.apache.commons" name="commons-parent"/>
-         <trusted-key id="b7c3b43d18eaa8b7" group="org.codehaus.mojo"/>
+         <trusted-key id="d433f9c895710db8ab087fa6b7c3b43d18eaa8b7" group="org.codehaus.mojo"/>
          <trusted-key id="b801e2f8ef035068ec1139cc29579f18fa8fd93b" group="com.google.j2objc"/>
-         <trusted-key id="bac30622339994c4" group="com.google.truth"/>
+         <trusted-key id="41cd49b4ef5876f9e9f691dabac30622339994c4" group="com.google.truth"/>
          <trusted-key id="bae5c184e3b70cb15617700598fe03a974ce0a0b" group="org.jetbrains.kotlin"/>
-         <trusted-key id="bb2914c1fa0811c3" group="net.bytebuddy"/>
+         <trusted-key id="f42b96b8648b5c4a1c43a62fbb2914c1fa0811c3" group="net.bytebuddy"/>
          <trusted-key id="bc87a3fd0a54480f0badbebd21939ff0ca2a6567" group="commons-codec" name="commons-codec"/>
          <trusted-key id="bcc135fc7ed8214f823d73e97fe9900f412d622e" group="com.google.flatbuffers"/>
          <trusted-key id="bdb5fa4fe719d787fb3d3197f6d4a1d411e9d1ae" group="com.google.guava"/>
-         <trusted-key id="be096e29edb8d141" group="net.sf.proguard"/>
+         <trusted-key id="cacfbd4755a2fc78709bdd92be096e29edb8d141" group="net.sf.proguard"/>
          <trusted-key id="be685132afd2740d9095f9040cc0b712fee75827" group="org.assertj"/>
-         <trusted-key id="beabcfbee059e4e5" group="com.github.siom79.japicmp"/>
-         <trusted-key id="bede11eaf1164480" group="org.hamcrest"/>
-         <trusted-key id="bf1518e0160788a2" group="org.apache" name="apache"/>
-         <trusted-key id="bf984b4145ea13f7" group="com.squareup" name="javapoet"/>
-         <trusted-key id="bffc9b54721244ad" group="org.apache.commons"/>
-         <trusted-key id="c1b12a5d99c0729d" group="org.jetbrains"/>
-         <trusted-key id="c2148900bcd3c2af" group="org.jetbrains.trove4j"/>
-         <trusted-key id="c29b11246382a4d7" group="com.charleskorn.kaml"/>
-         <trusted-key id="c51e6cbc7ff46f0b" group="com.google.auto.service"/>
+         <trusted-key id="fffd810fffde203d5fa27263beabcfbee059e4e5" group="com.github.siom79.japicmp"/>
+         <trusted-key id="e3a9f95079e84ce201f7cf60bede11eaf1164480" group="org.hamcrest"/>
+         <trusted-key id="ae9e53fc28ff2ab1012273d0bf1518e0160788a2" group="org.apache" name="apache"/>
+         <trusted-key id="1d0a8b5e77c678a7c724445abf984b4145ea13f7" group="com.squareup" name="javapoet"/>
+         <trusted-key id="808d78b17a5a2d7c3668e31fbffc9b54721244ad" group="org.apache.commons"/>
+         <trusted-key id="e62231331bca7e1f292c9b88c1b12a5d99c0729d" group="org.jetbrains"/>
+         <trusted-key id="b46dc71e03feeb7f89d1f2491f7a8f87b9d8f501" group="org.jetbrains.trove4j"/>
+         <trusted-key id="7cb548acfe3d47e92afa566dc29b11246382a4d7" group="com.charleskorn.kaml"/>
+         <trusted-key id="3288b8be8512d6c0ca185268c51e6cbc7ff46f0b" group="com.google.auto.service"/>
          <trusted-key id="c5aa57f4a38eba7b7f9156ddab2da4527f6ffc0b">
             <trusting group="com.squareup" name="kotlinpoet"/>
             <trusting group="com.squareup" name="kotlinpoet-javapoet"/>
@@ -410,16 +411,16 @@
             <trusting group="com.google.auto.value"/>
             <trusting group="com.google.code.gson"/>
          </trusted-key>
-         <trusted-key id="c7ca19b7b620d787" group="org.apache.maven"/>
+         <trusted-key id="042b29e928995b9db963c636c7ca19b7b620d787" group="org.apache.maven"/>
          <trusted-key id="c8741082ff1b0ee96bcabeec10ae8966a146e8be" group="com.google.crypto.tink" name="tink-android"/>
          <trusted-key id="c888b9955815ea83b48531784896f7312a5ace4d" group="^com[.]google($|([.].*))" regex="true"/>
-         <trusted-key id="c92c5fec70161c62" group="org.apache"/>
+         <trusted-key id="190d5a957ff22273e601f7a7c92c5fec70161c62" group="org.apache"/>
          <trusted-key id="c9a503282182ec4ecdb914ea102e05d8da6c286d" group="javax.xml.bind" name="jaxb-api"/>
          <trusted-key id="cacfbd4755a2fc78709bdd92be096e29edb8d141" group="net.sf.proguard"/>
          <trusted-key id="cb3190ca7842439e57f3712e44ce7bf2825ea2cd" group="com.ibm.icu" name="icu4j"/>
-         <trusted-key id="cb43338e060cf9fa" group="org.jacoco"/>
+         <trusted-key id="a413f67d71beec23add0ce0acb43338e060cf9fa" group="org.jacoco"/>
          <trusted-key id="cc4483cd6a3eb2939b948667a1b4460d8ba7b9af" group="org.mockito"/>
-         <trusted-key id="cc6346f2ce3872d9" group="com.google.protobuf"/>
+         <trusted-key id="ae2b18e836c5f30687f37efdcc6346f2ce3872d9" group="com.google.protobuf"/>
          <trusted-key id="cd5464315f0b98c77e6e8ecd9daadc1c9fcc82d0">
             <trusting group="commons-cli" name="commons-cli"/>
             <trusting group="org.apache.commons"/>
@@ -428,18 +429,18 @@
             <trusting group="org.apache.ant"/>
             <trusting group="org.apache.commons"/>
          </trusted-key>
-         <trusted-key id="cf9f3090ce4cb752" group="org.abego.treelayout"/>
-         <trusted-key id="cfae163b64ac9189" group="org.jetbrains.skiko"/>
-         <trusted-key id="d041cad2e452550f" group="com.google.protobuf"/>
+         <trusted-key id="d790f72ea8fd39551012b62dcf9f3090ce4cb752" group="org.abego.treelayout"/>
+         <trusted-key id="20723a6399bc060154283b37cfae163b64ac9189" group="org.jetbrains.skiko"/>
+         <trusted-key id="696b6199a2a9d8c29ce78cc0d041cad2e452550f" group="com.google.protobuf"/>
          <trusted-key id="d196a5e3e70732eeb2e5007f1861c322c56014b2" group="commons-lang"/>
          <trusted-key id="d477d51812e692011db11e66a6ea2e2bf22e0543" group="io.github.java-diff-utils"/>
          <trusted-key id="d4c89ea4aaf455fd88b22087efe8086f9e93774e" group="junit"/>
-         <trusted-key id="d4da5eab3cd7e958" group="com.google.devtools.ksp"/>
+         <trusted-key id="0d5d634755737a19abbe2930d4da5eab3cd7e958" group="com.google.devtools.ksp"/>
          <trusted-key id="d4fb0b7b5e8c18c993a8a386eb9d04a9a679fe18" group="com.uber.nullaway" name="nullaway"/>
          <trusted-key id="d54a395b5cf3f86eb45f6e426b1b008864323b92" group="org.antlr"/>
-         <trusted-key id="d5f4c07a434ab3da" group="com.squareup"/>
+         <trusted-key id="afa2b1823fc021bfd08c211fd5f4c07a434ab3da" group="com.squareup"/>
          <trusted-key id="d6f1bc78607808ec8e9f69437a8860944fad5f62" group="org.apache.commons" name="commons-parent"/>
-         <trusted-key id="d73c68ee4152c255" group="com.google.dagger"/>
+         <trusted-key id="0eb9d7c468f97e44051d650ad73c68ee4152c255" group="com.google.dagger"/>
          <trusted-key id="d75e25b78ebb19e47c0a99bca7764f502a938c99" group="com.google.protobuf"/>
          <trusted-key id="d790f72ea8fd39551012b62dcf9f3090ce4cb752" group="org.abego.treelayout" name="org.abego.treelayout.core"/>
          <trusted-key id="da7a1bb85b19e4fb05073431205c8673dc742c7c" group="org.apache.maven"/>
@@ -448,11 +449,11 @@
             <trusting group="com.squareup.okio"/>
             <trusting group="com.squareup.wire"/>
          </trusted-key>
-         <trusted-key id="dddafa7674e54418" group="org.testng"/>
-         <trusted-key id="e0130a3ed5a2079e" group="org.webjars"/>
-         <trusted-key id="e0cb7823cfd00fbf" group="com.jakewharton.android.repackaged"/>
+         <trusted-key id="7cd52b5a8295137c88fb5748dddafa7674e54418" group="org.testng"/>
+         <trusted-key id="fa1703b1d287caea3a60f931e0130a3ed5a2079e" group="org.webjars"/>
+         <trusted-key id="47bf592261cd1a8a69b703b4e0cb7823cfd00fbf" group="com.jakewharton.android.repackaged"/>
          <trusted-key id="e0d98c5fd55a8af232290e58dee12b9896f97e34" group="org.pcollections"/>
-         <trusted-key id="e16ab52d79fd224f" group="com.google.api.grpc"/>
+         <trusted-key id="47504b76cf89c15c0512d9afe16ab52d79fd224f" group="com.google.api.grpc"/>
          <trusted-key id="e3a9f95079e84ce201f7cf60bede11eaf1164480" group="org.hamcrest"/>
          <trusted-key id="e62231331bca7e1f292c9b88c1b12a5d99c0729d" group="org.jetbrains"/>
          <trusted-key id="e77417ac194160a3fabd04969a259c7ee636c5ed">
@@ -465,15 +466,15 @@
          <trusted-key id="ea0b70b5050192c98cfa7e4f3f36885c24df4b75" group="org.mozilla" name="rhino"/>
          <trusted-key id="ea23db1360d9029481e7f2efecdfea3cb4493b94" group="jline" name="jline"/>
          <trusted-key id="eaa526b91dd83ba3e1b9636fa730529ca355a63e" group="org.ccil.cowan.tagsoup" name="tagsoup"/>
-         <trusted-key id="eb380dc13c39f675" group="com.intellij"/>
-         <trusted-key id="eb9d04a9a679fe18" group="com.uber.nullaway"/>
-         <trusted-key id="ecdfea3cb4493b94" group="jline"/>
+         <trusted-key id="faabc3738b1f58da2d776fa2eb380dc13c39f675" group="com.intellij"/>
+         <trusted-key id="d4fb0b7b5e8c18c993a8a386eb9d04a9a679fe18" group="com.uber.nullaway"/>
+         <trusted-key id="ea23db1360d9029481e7f2efecdfea3cb4493b94" group="jline"/>
          <trusted-key id="ee0ca873074092f806f59b65d364abaa39a47320" group="com.google.errorprone"/>
-         <trusted-key id="ee9e7dc9d92fc896" group="com.google.errorprone"/>
-         <trusted-key id="eef9ecc7d5d90518" group="com.google.dagger"/>
-         <trusted-key id="efe8086f9e93774e" group="junit"/>
+         <trusted-key id="7f36e793ae3252e5d9e9b98fee9e7dc9d92fc896" group="com.google.errorprone"/>
+         <trusted-key id="3eb3846b3dc004c13883753ceef9ecc7d5d90518" group="com.google.dagger"/>
+         <trusted-key id="58e79b6abc762159dc0b1591164bd2247b936711" group="junit"/>
          <trusted-key id="f1a51e051f527e0c8e24d54d4b1e11d5a4b91e89" group="com.google.protobuf"/>
-         <trusted-key id="f1f111af65925306" group="io.github.classgraph"/>
+         <trusted-key id="1f47744c9b6e14f2049c2857f1f111af65925306" group="io.github.classgraph"/>
          <trusted-key id="f254b35617dc255d9344bcfa873a8e86b4372146">
             <trusting group="org.apache"/>
             <trusting group="org.codehaus.mojo"/>
@@ -481,7 +482,7 @@
          </trusted-key>
          <trusted-key id="f3184bcd55f4d016e30d4c9bf42e87f9665015c9" group="org.jsoup"/>
          <trusted-key id="f42b96b8648b5c4a1c43a62fbb2914c1fa0811c3" group="net.bytebuddy"/>
-         <trusted-key id="f800dd0933ecf7f7" group="com.google.guava"/>
+         <trusted-key id="00089ee8c3afa95a854d0f1df800dd0933ecf7f7" group="com.google.guava"/>
          <trusted-key id="fa1703b1d287caea3a60f931e0130a3ed5a2079e" group="org.webjars" name="jquery"/>
          <trusted-key id="fa77dcfef2ee6eb2debedd2c012579464d01c06a">
             <trusting group="org.apache" name="apache"/>
@@ -490,7 +491,7 @@
          <trusted-key id="fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd" group="net.java.dev.jna"/>
          <trusted-key id="faabc3738b1f58da2d776fa2eb380dc13c39f675" group="com.intellij" name="annotations"/>
          <trusted-key id="fc411cd3cb7dcb0abc9801058118b3bcdb1a5000" group="jakarta.xml.bind"/>
-         <trusted-key id="fd5dea07fcb690a8" group="org.codehaus.mojo"/>
+         <trusted-key id="720746177725a89207a7075bfd5dea07fcb690a8" group="org.codehaus.mojo"/>
          <trusted-key id="ff460acf3266fdce8eb8fe3ba797295e9d87bdd0" group="androidx.build.gradle.gcpbuildcache" name="gcpbuildcache"/>
          <trusted-key id="ff6e2c001948c5f2f38b0cc385911f425ec61b51">
             <trusting group="junit"/>
@@ -503,15 +504,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 +528,41 @@
             <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.libraries.identity.googleid" name="googleid" version="0.0.2">
+         <artifact name="googleid-0.0.2.aar">
+            <sha256 value="ae69047587928df1ff82ce71e9f2ec40a777270f04f4a6d1f66241944961b682" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="googleid-0.0.2.pom">
+            <sha256 value="100a2c6db1ec4aab9545ead93be094c9728ecc671fba8353648d04ef405f30c8" origin="Generated by Gradle"/>
          </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 +573,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 +589,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 +657,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 +681,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 +775,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 +817,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 +841,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 +849,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 +935,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 +943,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 +959,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 +988,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.10" androidx:reason="Unsigned, b/227204920">
-         <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"/>
-         </artifact>
-      </component>
-
-      <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"/>
+            <sha256 value="4e54622f5dc0f8b6c51e28650268f001e3b55d076c8e3a9d9731c050820c0a3d" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
    </components>
diff --git a/gradlew b/gradlew
index 9b54b57..11139b9 100755
--- a/gradlew
+++ b/gradlew
@@ -396,7 +396,13 @@
 
   RETURN_VALUE=0
   PROJECT_CACHE_DIR_ARGUMENT="--project-cache-dir $OUT_DIR/gradle-project-cache"
-  if $wrapper "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG $PROJECT_CACHE_DIR_ARGUMENT "$ORG_GRADLE_JVMARGS" "$@"; then
+  # Disabled in Studio until these errors become shown (b/268380971) or computed more quickly (https://github.com/gradle/gradle/issues/23272)
+  if [[ " ${@} " =~ " --dependency-verification=" ]]; then
+    VERIFICATION_ARGUMENT="" # already specified by caller
+  else
+    VERIFICATION_ARGUMENT=--dependency-verification=strict
+  fi
+  if $wrapper "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG $PROJECT_CACHE_DIR_ARGUMENT $VERIFICATION_ARGUMENT "$ORG_GRADLE_JVMARGS" "$@"; then
     RETURN_VALUE=0
   else
     # Print AndroidX-specific help message if build fails
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-core/src/androidTest/java/androidx/graphics/opengl/SyncStrategyTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncStrategyTest.kt
index f47e622..38050ea 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncStrategyTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncStrategyTest.kt
@@ -42,58 +42,72 @@
     @RequiresApi(Build.VERSION_CODES.O)
     @Test
     fun testSyncStrategy_Always() {
-        val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val strategy = SyncStrategy.ALWAYS
-            val fence = strategy.createSyncFence(egl.eglSpec)
-            assertTrue(fence != null)
-            fence?.close()
+        withEgl { egl ->
+            if (egl.supportsNativeAndroidFence()) {
+                val strategy = SyncStrategy.ALWAYS
+                val fence = strategy.createSyncFence(egl.eglSpec)
+                assertTrue(fence != null)
+                fence?.close()
+            }
         }
     }
 
     @Test
     fun testSyncStrategy_onFirstShow_FrontBufferUsageOff_Invisible() {
-        val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val strategy = FrontBufferSyncStrategy(0L)
-            val fence = strategy.createSyncFence(EGLSpec.V14)
-            assertTrue(fence != null)
-            fence?.close()
+        withEgl { egl ->
+            if (egl.supportsNativeAndroidFence()) {
+                val strategy = FrontBufferSyncStrategy(0L)
+                val fence = strategy.createSyncFence(EGLSpec.V14)
+                assertTrue(fence != null)
+                fence?.close()
+            }
         }
     }
 
     @Test
     fun testSyncStrategy_onFirstShow_FrontBufferUsageOff_Visible() {
-        val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val strategy = FrontBufferSyncStrategy(0L)
-            strategy.isVisible = true
-            val fence = strategy.createSyncFence(EGLSpec.V14)
-            assertTrue(fence == null)
-            fence?.close()
+        withEgl { egl ->
+            if (egl.supportsNativeAndroidFence()) {
+                val strategy = FrontBufferSyncStrategy(0L)
+                strategy.isVisible = true
+                val fence = strategy.createSyncFence(EGLSpec.V14)
+                assertTrue(fence == null)
+                fence?.close()
+            }
         }
     }
 
     @Test
     fun testSyncStrategy_onFirstShow_FrontBufferUsageOn_Invisible() {
-        val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val strategy = FrontBufferSyncStrategy(mUsageFlags)
-            val fence = strategy.createSyncFence(egl.eglSpec)
-            assertTrue(fence != null)
-            fence?.close()
+        withEgl { egl ->
+            if (egl.supportsNativeAndroidFence()) {
+                val strategy = FrontBufferSyncStrategy(mUsageFlags)
+                val fence = strategy.createSyncFence(egl.eglSpec)
+                assertTrue(fence != null)
+                fence?.close()
+            }
         }
     }
 
     @Test
     fun testSyncStrategy_onFirstShow_FrontBufferUsageOn_Visible() {
+        withEgl { egl ->
+            if (egl.supportsNativeAndroidFence()) {
+                val strategy = FrontBufferSyncStrategy(mUsageFlags)
+                strategy.isVisible = true
+                val fence = strategy.createSyncFence(EGLSpec.V14)
+                assertTrue(fence == null)
+                fence?.close()
+            }
+        }
+    }
+
+    private fun withEgl(block: (egl: EGLManager) -> Unit) {
         val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val strategy = FrontBufferSyncStrategy(mUsageFlags)
-            strategy.isVisible = true
-            val fence = strategy.createSyncFence(EGLSpec.V14)
-            assertTrue(fence == null)
-            fence?.close()
+        try {
+            block(egl)
+        } finally {
+            releaseEGLManager(egl)
         }
     }
 
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
index f7e5a2b..d2a9139 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/egl/EGLManagerTest.kt
@@ -58,7 +58,6 @@
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Assert.fail
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -221,7 +220,6 @@
         }
     }
 
-    @Ignore // b/266736718
     @Test
     fun testCreatePBufferSurface() {
         testEGLManager {
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
index b475f0b..b93c174 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
@@ -45,7 +45,6 @@
 import org.junit.Assert.assertTrue
 import org.junit.Assert.fail
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -569,8 +568,6 @@
     }
 
     @Test
-    @Ignore("b/262903415")
-    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testTransactionSetBuffer_singleReleaseCallback() {
         if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
             return // b/262909049: Do not run this test on pre-release Android U.
@@ -633,9 +630,7 @@
         }
     }
 
-    @Ignore("b/262909049")
     @Test
-    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun testTransactionSetBuffer_multipleReleaseCallbacksAndOverwriteWithSingleSC() {
         if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
             return // b/262909049: Do not run this test on pre-release Android U.
@@ -782,7 +777,6 @@
         }
     }
 
-    @Ignore("b/262909049")
     @Test
     fun testTransactionSetBuffer_ReleaseCallbacksAndOverwriteWithMultipleSC() {
         val releaseLatch = CountDownLatch(1)
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..e2d1805
--- /dev/null
+++ b/health/connect/connect-client/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+MissingJvmstatic: androidx.health.connect.client.HealthConnectClient#ACTION_HEALTH_CONNECT_SETTINGS:
+    Companion object constants like ACTION_HEALTH_CONNECT_SETTINGS should be using @JvmField, not @JvmStatic; see https://developer.android.com/kotlin/interop#companion_constants
diff --git a/health/connect/connect-client/api/current.txt b/health/connect/connect-client/api/current.txt
index b0febf5..1557dcd 100644
--- a/health/connect/connect-client/api/current.txt
+++ b/health/connect/connect-client/api/current.txt
@@ -9,26 +9,40 @@
     method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? getChanges(String changesToken, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ChangesResponse>);
     method public suspend Object? getChangesToken(androidx.health.connect.client.request.ChangesTokenRequest request, kotlin.coroutines.Continuation<? super java.lang.String>);
+    method public default static String getHealthConnectSettingsAction();
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     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 default static String ACTION_HEALTH_CONNECT_SETTINGS;
     property public abstract androidx.health.connect.client.PermissionController permissionController;
     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 String getHealthConnectSettingsAction();
     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);
+    property public final String 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 +441,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 +465,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 +487,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 +496,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 +1333,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 +1361,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 +1393,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 +1400,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 +1416,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 +1428,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 +1444,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 +1464,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 +1484,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..1557dcd 100644
--- a/health/connect/connect-client/api/public_plus_experimental_current.txt
+++ b/health/connect/connect-client/api/public_plus_experimental_current.txt
@@ -9,26 +9,40 @@
     method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? getChanges(String changesToken, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ChangesResponse>);
     method public suspend Object? getChangesToken(androidx.health.connect.client.request.ChangesTokenRequest request, kotlin.coroutines.Continuation<? super java.lang.String>);
+    method public default static String getHealthConnectSettingsAction();
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     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 default static String ACTION_HEALTH_CONNECT_SETTINGS;
     property public abstract androidx.health.connect.client.PermissionController permissionController;
     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 String getHealthConnectSettingsAction();
     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);
+    property public final String 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 +441,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 +465,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 +487,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 +496,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 +1333,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 +1361,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 +1393,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 +1400,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 +1416,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 +1428,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 +1444,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 +1464,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 +1484,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..8b5c16b 100644
--- a/health/connect/connect-client/api/restricted_current.txt
+++ b/health/connect/connect-client/api/restricted_current.txt
@@ -9,26 +9,40 @@
     method public suspend Object? deleteRecords(kotlin.reflect.KClass<? extends androidx.health.connect.client.records.Record> recordType, androidx.health.connect.client.time.TimeRangeFilter timeRangeFilter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? getChanges(String changesToken, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ChangesResponse>);
     method public suspend Object? getChangesToken(androidx.health.connect.client.request.ChangesTokenRequest request, kotlin.coroutines.Continuation<? super java.lang.String>);
+    method public default static String getHealthConnectSettingsAction();
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     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 default static String ACTION_HEALTH_CONNECT_SETTINGS;
     property public abstract androidx.health.connect.client.PermissionController permissionController;
     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 String getHealthConnectSettingsAction();
     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);
+    property public final String 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 +441,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 +465,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 +487,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 +496,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 +1356,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 +1384,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 +1416,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 +1423,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 +1439,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 +1451,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 +1467,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 +1487,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 +1507,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..8676442 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
@@ -57,13 +58,23 @@
      * [androidx.health.connect.client.records.metadata.Metadata.id] generated. Insertion of
      * multiple [records] is executed in a transaction - if one fails, none is inserted.
      *
+     * @param records List of records to insert
+     * @return List of unique identifiers in the order of inserted records.
+     * @throws RemoteException For any IPC transportation failures.
+     * @throws SecurityException For requests with unpermitted access.
+     * @throws IOException For any disk I/O issues.
+     * @throws IllegalStateException If service is not available.
+     *
      * For example, to insert basic data like step counts:
+     *
      * @sample androidx.health.connect.client.samples.InsertSteps
      *
      * To insert more complex data like nutrition for a user who’s eaten a banana:
+     *
      * @sample androidx.health.connect.client.samples.InsertNutrition
      *
      * To insert some heart rate data:
+     *
      * @sample androidx.health.connect.client.samples.InsertHeartRateSeries
      *
      * [androidx.health.connect.client.records.metadata.Metadata.clientRecordId] can be used to
@@ -73,13 +84,6 @@
      * with the higher
      * [androidx.health.connect.client.records.metadata.Metadata.clientRecordVersion] takes
      * precedence.
-     *
-     * @param records List of records to insert
-     * @return List of unique identifiers in the order of inserted records.
-     * @throws RemoteException For any IPC transportation failures.
-     * @throws SecurityException For requests with unpermitted access.
-     * @throws IOException For any disk I/O issues.
-     * @throws IllegalStateException If service is not available.
      */
     suspend fun insertRecords(records: List<Record>): InsertRecordsResponse
 
@@ -89,7 +93,7 @@
      *
      * @param records List of records to update
      * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
-     * will result in IPC failure.
+     *   will result in IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
@@ -100,19 +104,20 @@
      * Deletes one or more [Record] by their identifiers. Deletion of multiple [Record] is executed
      * in single transaction - if one fails, none is deleted.
      *
-     * Example usage to delete written steps data by its unique identifier:
-     * @sample androidx.health.connect.client.samples.DeleteByUniqueIdentifier
-     *
      * @param recordType Which type of [Record] to delete, such as `Steps::class`
      * @param recordIdsList List of [androidx.health.connect.client.records.metadata.Metadata.id] of
-     * [Record] to delete
+     *   [Record] to delete
      * @param clientRecordIdsList List of client record IDs of [Record] to delete
      * @throws RemoteException For any IPC transportation failures. Deleting by invalid identifiers
-     * such as a non-existing identifier or deleting the same record multiple times will result in
-     * IPC failure.
+     *   such as a non-existing identifier or deleting the same record multiple times will result in
+     *   IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example usage to delete written steps data by its unique identifier:
+     *
+     * @sample androidx.health.connect.client.samples.DeleteByUniqueIdentifier
      */
     suspend fun deleteRecords(
         recordType: KClass<out Record>,
@@ -125,15 +130,16 @@
      * filtered to [Record] belonging to the calling application). Deletion of multiple [Record] is
      * executed in a transaction - if one fails, none is deleted.
      *
-     * Example usage to delete written steps data in a time range:
-     * @sample androidx.health.connect.client.samples.DeleteByTimeRange
-     *
      * @param recordType Which type of [Record] to delete, such as `Steps::class`
      * @param timeRangeFilter The [TimeRangeFilter] to delete from
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example usage to delete written steps data in a time range:
+     *
+     * @sample androidx.health.connect.client.samples.DeleteByTimeRange
      */
     suspend fun deleteRecords(recordType: KClass<out Record>, timeRangeFilter: TimeRangeFilter)
 
@@ -142,10 +148,10 @@
      *
      * @param recordType Which type of [Record] to read, such as `Steps::class`
      * @param recordId [androidx.health.connect.client.records.metadata.Metadata.id] of [Record] to
-     * read
+     *   read
      * @return The [Record] data point.
      * @throws RemoteException For any IPC transportation failures. Update with invalid identifiers
-     * will result in IPC failure.
+     *   will result in IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
@@ -158,17 +164,17 @@
     /**
      * Retrieves a collection of [Record]s.
      *
-     * Example code to read basic data like step counts:
-     * @sample androidx.health.connect.client.samples.ReadStepsRange
-     *
      * @param T the type of [Record]
      * @param request [ReadRecordsRequest] object specifying time range and other filters
-     *
      * @return a response containing a collection of [Record]s.
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example code to read basic data like step counts:
+     *
+     * @sample androidx.health.connect.client.samples.ReadStepsRange
      */
     suspend fun <T : Record> readRecords(request: ReadRecordsRequest<T>): ReadRecordsResponse<T>
 
@@ -176,20 +182,21 @@
      * Reads [AggregateMetric]s according to requested read criteria: [Record]s from
      * [AggregateRequest.dataOriginFilter] and within [AggregateRequest.timeRangeFilter].
      *
-     * Example code to aggregate cumulative data like distance:
-     * @sample androidx.health.connect.client.samples.AggregateDistance
-     *
-     * Example code to retrieve statistical aggregates like maximum or minimum heart rate:
-     * @sample androidx.health.connect.client.samples.AggregateHeartRate
-     *
      * @param request [AggregateRequest] object specifying [AggregateMetric]s to aggregate and other
-     * filters.
-     *
+     *   filters.
      * @return the [AggregationResult] that contains aggregated values.
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example code to aggregate cumulative data like distance:
+     *
+     * @sample androidx.health.connect.client.samples.AggregateDistance
+     *
+     * Example code to retrieve statistical aggregates like maximum or minimum heart rate:
+     *
+     * @sample androidx.health.connect.client.samples.AggregateHeartRate
      */
     suspend fun aggregate(request: AggregateRequest): AggregationResult
 
@@ -204,18 +211,18 @@
      * An [AggregationResultGroupedByDuration] is returned only if there are [Record] to aggregate
      * within start and end time of the row.
      *
-     * Example code to retrieve cumulative step count for each minute within provided time range:
-     * @sample androidx.health.connect.client.samples.AggregateIntoMinutes
-     *
      * @param request [AggregateGroupByDurationRequest] object specifying [AggregateMetric]s to
-     * aggregate and other filters.
-     *
+     *   aggregate and other filters.
      * @return a list of [AggregationResultGroupedByDuration]s, each contains aggregated values and
-     * start/end time of the row. The list is sorted by time in ascending order.
+     *   start/end time of the row. The list is sorted by time in ascending order.
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example code to retrieve cumulative step count for each minute within provided time range:
+     *
+     * @sample androidx.health.connect.client.samples.AggregateIntoMinutes
      */
     suspend fun aggregateGroupByDuration(
         request: AggregateGroupByDurationRequest,
@@ -232,18 +239,18 @@
      * An [AggregationResultGroupedByPeriod] is returned only if there are [Record] to aggregate
      * within start and end time of the row.
      *
-     * Example code to retrieve cumulative step count for each month within provided time range:
-     * @sample androidx.health.connect.client.samples.AggregateIntoMonths
-     *
      * @param request [AggregateGroupByPeriodRequest] object specifying [AggregateMetric]s to
-     * aggregate and other filters.
-     *
+     *   aggregate and other filters.
      * @return a list of [AggregationResultGroupedByPeriod]s, each contains aggregated values and
-     * start/end time of the row. The list is sorted by time in ascending order.
+     *   start/end time of the row. The list is sorted by time in ascending order.
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
+     *
+     * Example code to retrieve cumulative step count for each month within provided time range:
+     *
+     * @sample androidx.health.connect.client.samples.AggregateIntoMonths
      */
     suspend fun aggregateGroupByPeriod(
         request: AggregateGroupByPeriodRequest,
@@ -262,11 +269,9 @@
      *
      * @param request Includes interested types of record to observe changes and optional filters.
      * @return a changes-token
-     *
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IllegalStateException If service is not available.
-     *
      * @see getChanges
      */
     suspend fun getChangesToken(request: ChangesTokenRequest): String
@@ -291,12 +296,10 @@
      *
      * @param notificationIntentAction an action to be used for broadcast messages.
      * @param recordTypes specifies [Record] types of interest.
-     *
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
-     *
      * @see unregisterFromDataNotifications
      * @see androidx.health.connect.client.datanotification.DataNotification
      */
@@ -310,13 +313,11 @@
      * Unregisters the provided [notificationIntentAction] from data notifications.
      *
      * @param notificationIntentAction an action previously registered using
-     * [registerForDataNotifications] method.
-     *
+     *   [registerForDataNotifications] method.
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
-     *
      * @see registerForDataNotifications
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY) // Not yet ready for public
@@ -344,13 +345,11 @@
      * ```
      *
      * @param changesToken A Changes-Token that represents a specific point in time in Android
-     * Health Platform.
+     *   Health Platform.
      * @return a [ChangesResponse] with changes since provided [changesToken].
-     *
      * @throws RemoteException For any IPC transportation failures.
      * @throws SecurityException For requests with unpermitted access.
      * @throws IllegalStateException If service is not available.
-     *
      * @see getChangesToken
      */
     suspend fun getChanges(changesToken: String): ChangesResponse
@@ -362,9 +361,74 @@
         @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 =
-            "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS"
+        /**
+         * 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.
+         */
+        @get:JvmName("getHealthConnectSettingsAction")
+        @JvmStatic
+        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
@@ -374,6 +438,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 +448,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
             }
@@ -407,11 +472,10 @@
          *
          * @param context the context
          * @param providerPackageName optional alternative package provider to choose for backend
-         * implementation
+         *   implementation
          * @return instance of [HealthConnectClient] ready for issuing requests
          * @throws UnsupportedOperationException if service not available due to SDK version too low
          * @throws IllegalStateException if service not available due to not installed
-         *
          * @see isProviderAvailable
          */
         @JvmOverloads
@@ -420,9 +484,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")
             }
@@ -448,7 +514,7 @@
             return packageInfo.applicationInfo.enabled &&
                 (packageName != DEFAULT_PROVIDER_PACKAGE_NAME ||
                     PackageInfoCompat.getLongVersionCode(packageInfo) >=
-                    DEFAULT_PROVIDER_MIN_VERSION_CODE) &&
+                        DEFAULT_PROVIDER_MIN_VERSION_CODE) &&
                 hasBindableService(packageManager, packageName)
         }
 
@@ -465,6 +531,7 @@
 
         /**
          * Tag used in SDK debug logs.
+         *
          * @suppress
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY)
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/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/androidTest/java/androidx/leanback/widget/GridWidgetTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
index 77a5b38..0c619b1 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
@@ -2105,6 +2105,7 @@
         assertFalse(scrolled[0]);
     }
 
+    @Ignore // b/268680302
     @Test
     public void testItemMovedHorizontal() throws Throwable {
         Intent intent = new Intent();
@@ -2251,6 +2252,7 @@
         assertEquals(topPadding, mGridView.findViewHolderForAdapterPosition(0).itemView.getTop());
     }
 
+    @Ignore // b/268680302
     @Test
     public void testItemMovedVertical() throws Throwable {
 
diff --git a/leanback/leanback/src/main/res/values-ca/strings.xml b/leanback/leanback/src/main/res/values-ca/strings.xml
index afd2cd7e..dd75548 100644
--- a/leanback/leanback/src/main/res/values-ca/strings.xml
+++ b/leanback/leanback/src/main/res/values-ca/strings.xml
@@ -47,7 +47,7 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"Desactiva l\'alta qualitat"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2346334170216706076">"Activa els subtítols"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="8691966842977635128">"Desactiva els subtítols"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="5770668162543767702">"Entra al mode de pantalla en pantalla"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="5770668162543767702">"Entra al mode d\'imatge sobre imatge"</string>
     <string name="lb_playback_time_separator" msgid="1471121602610716654">"/"</string>
     <string name="lb_playback_controls_shown" msgid="8690223891515602822">"Es mostren els controls multimèdia"</string>
     <string name="lb_playback_controls_hidden" msgid="5859666950961624736">"S\'han amagat els controls multimèdia; prem la creu direccional per mostrar-los"</string>
diff --git a/libraryversions.toml b/libraryversions.toml
index f7557ea..4877b50 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -1,14 +1,14 @@
 [versions]
-ACTIVITY = "1.7.0-beta01"
+ACTIVITY = "1.7.0-beta02"
 ADS_IDENTIFIER = "1.0.0-alpha05"
-ANNOTATION = "1.6.0-rc01"
+ANNOTATION = "1.7.0-alpha01"
 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"
+APPCOMPAT = "1.7.0-alpha03"
 APPSEARCH = "1.1.0-alpha03"
-ARCH_CORE = "2.2.0-rc01"
+ARCH_CORE = "2.3.0-alpha01"
 ASYNCLAYOUTINFLATER = "1.1.0-alpha02"
 AUTOFILL = "1.2.0-beta02"
 BENCHMARK = "1.2.0-alpha10"
@@ -22,16 +22,16 @@
 CAR_APP = "1.4.0-alpha01"
 COLLECTION = "1.3.0-alpha03"
 COLLECTION_KMP = "1.3.0-dev01"
-COMPOSE = "1.4.0-beta01"
+COMPOSE = "1.4.0-beta02"
 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"
-CONSTRAINTLAYOUT_CORE = "1.1.0-alpha07"
+COMPOSE_MATERIAL3 = "1.1.0-alpha07"
+COMPOSE_RUNTIME_TRACING = "1.0.0-alpha03"
+CONSTRAINTLAYOUT = "2.2.0-alpha08"
+CONSTRAINTLAYOUT_COMPOSE = "1.1.0-alpha08"
+CONSTRAINTLAYOUT_CORE = "1.1.0-alpha08"
 CONTENTPAGER = "1.1.0-alpha01"
 COORDINATORLAYOUT = "1.3.0-alpha01"
-CORE = "1.10.0-alpha03"
+CORE = "1.10.0-beta01"
 CORE_ANIMATION = "1.0.0-beta02"
 CORE_ANIMATION_TESTING = "1.0.0-beta01"
 CORE_APPDIGEST = "1.0.0-alpha01"
@@ -43,7 +43,7 @@
 CORE_ROLE = "1.2.0-alpha01"
 CORE_SPLASHSCREEN = "1.1.0-alpha01"
 CORE_UWB = "1.0.0-alpha05"
-CREDENTIALS = "1.0.0-alpha02"
+CREDENTIALS = "1.0.0-alpha03"
 CURSORADAPTER = "1.1.0-alpha01"
 CUSTOMVIEW = "1.2.0-alpha03"
 CUSTOMVIEW_POOLINGCONTAINER = "1.1.0-alpha01"
@@ -51,15 +51,15 @@
 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 = "1.3.0-beta03"
 EMOJI2_QUARANTINE = "1.0.0-alpha02"
 ENTERPRISE = "1.1.0-rc01"
 EXIFINTERFACE = "1.4.0-alpha01"
-FRAGMENT = "1.6.0-alpha05"
+FRAGMENT = "1.6.0-alpha06"
 FUTURES = "1.2.0-alpha01"
 GLANCE = "1.0.0-alpha06"
 GLANCE_TEMPLATE = "1.0.0-alpha01"
@@ -82,25 +82,25 @@
 LEANBACK_TAB = "1.1.0-beta01"
 LEGACY = "1.1.0-alpha01"
 LIBYUV = "0.1.0-dev01"
-LIFECYCLE = "2.6.0-beta01"
+LIFECYCLE = "2.6.0-rc01"
 LIFECYCLE_EXTENSIONS = "2.2.0"
 LOADER = "1.2.0-alpha01"
-MEDIA = "1.7.0-alpha01"
+MEDIA = "1.7.0-alpha02"
 MEDIA2 = "1.3.0-alpha01"
 MEDIAROUTER = "1.4.0-beta02"
 METRICS = "1.0.0-alpha04"
-NAVIGATION = "2.6.0-alpha05"
-PAGING = "3.2.0-alpha04"
-PAGING_COMPOSE = "1.0.0-alpha18"
+NAVIGATION = "2.6.0-alpha06"
+PAGING = "3.2.0-alpha05"
+PAGING_COMPOSE = "1.0.0-alpha19"
 PALETTE = "1.1.0-alpha01"
 PERCENTLAYOUT = "1.1.0-alpha01"
 PREFERENCE = "1.3.0-alpha01"
 PRINT = "1.1.0-beta01"
-PRIVACYSANDBOX_ADS = "1.0.0-alpha01"
+PRIVACYSANDBOX_ADS = "1.0.0-beta01"
 PRIVACYSANDBOX_SDKRUNTIME = "1.0.0-alpha01"
 PRIVACYSANDBOX_TOOLS = "1.0.0-alpha03"
 PRIVACYSANDBOX_UI = "1.0.0-alpha01"
-PROFILEINSTALLER = "1.3.0-beta01"
+PROFILEINSTALLER = "1.3.0-beta02"
 RECOMMENDATION = "1.1.0-alpha01"
 RECYCLERVIEW = "1.4.0-alpha01"
 RECYCLERVIEW_SELECTION = "1.2.0-alpha02"
@@ -121,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"
@@ -128,7 +129,7 @@
 TEST_UIAUTOMATOR = "2.3.0-alpha03"
 TEXT = "1.0.0-alpha01"
 TRACING = "1.2.0-alpha02"
-TRACING_PERFETTO = "1.0.0-alpha10"
+TRACING_PERFETTO = "1.0.0-alpha11"
 TRANSITION = "1.5.0-alpha01"
 TV = "1.0.0-alpha04"
 TVPROVIDER = "1.1.0-alpha02"
@@ -139,19 +140,19 @@
 VIEWPAGER = "1.1.0-alpha02"
 VIEWPAGER2 = "1.2.0-alpha01"
 WEAR = "1.3.0-alpha05"
-WEAR_COMPOSE = "1.2.0-alpha04"
+WEAR_COMPOSE = "1.2.0-alpha05"
 WEAR_COMPOSE_MATERIAL3 = "1.0.0-alpha01"
 WEAR_INPUT = "1.2.0-alpha03"
 WEAR_INPUT_TESTING = "1.2.0-alpha03"
 WEAR_ONGOING = "1.1.0-alpha01"
 WEAR_PHONE_INTERACTIONS = "1.1.0-alpha04"
-WEAR_PROTOLAYOUT = "1.0.0-alpha03"
+WEAR_PROTOLAYOUT = "1.0.0-alpha04"
 WEAR_REMOTE_INTERACTIONS = "1.1.0-alpha01"
 WEAR_TILES = "1.2.0-alpha01"
 WEAR_WATCHFACE = "1.2.0-alpha07"
-WEBKIT = "1.7.0-alpha02"
-WINDOW = "1.1.0-alpha05"
-WINDOW_EXTENSIONS = "1.1.0-alpha02"
+WEBKIT = "1.7.0-alpha03"
+WINDOW = "1.1.0-alpha06"
+WINDOW_EXTENSIONS = "1.1.0-alpha03"
 WINDOW_EXTENSIONS_CORE = "1.0.0-alpha01"
 WINDOW_SIDECAR = "1.0.0-rc01"
 WORK = "2.9.0-alpha01"
@@ -249,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-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-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/src/main/java/androidx/lifecycle/Transformations.kt b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.kt
index 26d7c36..c3b9ed6 100644
--- a/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.kt
+++ b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.kt
@@ -177,19 +177,20 @@
 @CheckResult
 fun <X> LiveData<X>.distinctUntilChanged(): LiveData<X> {
     val outputLiveData = MediatorLiveData<X>()
-    outputLiveData.addSource(this, object : Observer<X> {
-        var firstTime = true
-
-        override fun onChanged(value: X) {
-            val previousValue = outputLiveData.value
-            if (firstTime ||
-                previousValue == null && value != null ||
-                previousValue != null && previousValue != value
-            ) {
-                firstTime = false
-                outputLiveData.value = value
-            }
+    var firstTime = true
+    if (isInitialized) {
+        outputLiveData.value = value
+        firstTime = false
+    }
+    outputLiveData.addSource(this) { value ->
+        val previousValue = outputLiveData.value
+        if (firstTime ||
+            previousValue == null && value != null ||
+            previousValue != null && previousValue != value
+        ) {
+            firstTime = false
+            outputLiveData.value = value
         }
-    })
+    }
     return outputLiveData
 }
\ No newline at end of file
diff --git a/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
index 4b1a493..d7f3527 100644
--- a/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
+++ b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
@@ -193,6 +193,19 @@
     }
 
     @Test
+    public void testDistinctUntilChanged_initialValueIsSet() {
+        MutableLiveData<String> originalLiveData = new MutableLiveData<>("value");
+
+        LiveData<String> dedupedLiveData = Transformations.distinctUntilChanged(originalLiveData);
+        assertThat(dedupedLiveData.getValue(), is("value"));
+
+        CountingObserver<String> observer = new CountingObserver<>();
+        dedupedLiveData.observe(mOwner, observer);
+        assertThat(observer.mTimesUpdated, is(1));
+        assertThat(dedupedLiveData.getValue(), is("value"));
+    }
+
+    @Test
     public void testDistinctUntilChanged_triggersOnInitialNullValue() {
         MutableLiveData<String> originalLiveData = new MutableLiveData<>();
         originalLiveData.setValue(null);
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/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index 1f23cf2..ba33a165 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -21,6 +21,7 @@
     // necessary for IJ to resolve dependencies.
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.arch.core:core-runtime:2.2.0-rc01")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
 
     testImplementation(libs.junit)
     testImplementation(libs.mockitoCore4)
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt
index 05b6910..33d89fc 100644
--- a/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt
+++ b/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.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/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/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.txt
index 05b6910..33d89fc 100644
--- a/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.txt
+++ b/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.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/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/lint-checks/integration-tests/src/main/java/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java
new file mode 100644
index 0000000..2128027
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java
@@ -0,0 +1,54 @@
+/*
+ * 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;
+
+import android.widget.BaseAdapter;
+
+import androidx.annotation.RequiresApi;
+
+import java.nio.CharBuffer;
+
+/**
+ * Contains unsafe calls to a method with a variable number of arguments which are implicitly cast.
+ */
+@SuppressWarnings("unused")
+public class AutofixOnUnsafeCallWithImplicitVarArgsCast {
+    /**
+     * Calls the vararg method with no args.
+     */
+    @RequiresApi(27)
+    public void callVarArgsMethodNoArgs(BaseAdapter adapter) {
+        adapter.setAutofillOptions();
+    }
+
+    /**
+     *Calls the vararg method with one args.
+     */
+    @RequiresApi(27)
+    public void callVarArgsMethodOneArg(BaseAdapter adapter, CharBuffer vararg) {
+        adapter.setAutofillOptions(vararg);
+    }
+
+    /**
+     * Calls the vararg method with multiple args.
+     */
+    @RequiresApi(27)
+    public void callVarArgsMethodManyArgs(BaseAdapter adapter, CharBuffer vararg1,
+            CharBuffer vararg2, CharBuffer vararg3) {
+        adapter.setAutofillOptions(vararg1, vararg2, vararg3);
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitCast.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitCast.java
deleted file mode 100644
index 0e074a7..0000000
--- a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitCast.java
+++ /dev/null
@@ -1,77 +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;
-
-import android.app.Notification;
-import android.graphics.drawable.AdaptiveIconDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-
-import androidx.annotation.RequiresApi;
-
-/**
- * Tests to ensure the generated lint fix does not leave in implicit casts from a new type.
- */
-@SuppressWarnings("unused")
-public abstract class AutofixUnsafeCallWithImplicitCast {
-    /**
-     * This method creates an AdaptiveIconDrawable and implicitly casts it to Drawable.
-     */
-    @RequiresApi(26)
-    public Drawable createAdaptiveIconDrawableReturnDrawable() {
-        return new AdaptiveIconDrawable(null, null);
-    }
-
-    /**
-     * This method also creates an AdaptiveIconDrawable but does not cast it to Drawable.
-     */
-    @RequiresApi(26)
-    public AdaptiveIconDrawable createAndReturnAdaptiveIconDrawable() {
-        return new AdaptiveIconDrawable(null, null);
-    }
-
-    /**
-     * This calls a method returning an Icon and implicitly casts it to Object.
-     */
-    @RequiresApi(26)
-    public Object methodReturnsIconAsObject() {
-        return Icon.createWithAdaptiveBitmap(null);
-    }
-
-    /**
-     * This calls a method returning an Icon and returns it as an Icon.
-     */
-    @RequiresApi(26)
-    public Icon methodReturnsIconAsIcon() {
-        return Icon.createWithAdaptiveBitmap(null);
-    }
-
-    /**
-     * This uses the constructed value as Notification.Style in a method call.
-     */
-    @RequiresApi(24)
-    public void methodUsesStyleAsParam() {
-        useStyle(new Notification.DecoratedCustomViewStyle());
-    }
-
-    /**
-     * This is here so there's a method to use the DecoratedCustomViewStyle as a Style.
-     */
-    static boolean useStyle(Notification.Style style) {
-        return false;
-    }
-}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitParamCast.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitParamCast.java
new file mode 100644
index 0000000..cc20718
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitParamCast.java
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+import android.app.Notification;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Tests to ensure the generated lint fix does not leave in implicit casts from a new argument type.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeCallWithImplicitParamCast {
+    /**
+     * This uses the Notification.MessagingStyle type, but setBuilder is defined on
+     * Notification.Style, and the two classes were introduced in different API levels.
+     */
+    @RequiresApi(24)
+    public void castReceiver(Notification.MessagingStyle style, Notification.Builder builder) {
+        style.setBuilder(builder);
+    }
+
+    /**
+     * This uses Notification.CarExtender, but extend is defined with Notification.Extender as a
+     * parameter, and the two classes were introduced at different API levels.
+     */
+    @RequiresApi(23)
+    public void castParameter(Notification.Builder builder, Notification.CarExtender extender) {
+        builder.extend(extender);
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitReturnCast.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitReturnCast.java
new file mode 100644
index 0000000..0eed5cb
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeCallWithImplicitReturnCast.java
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+import android.app.Notification;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Tests to ensure the generated lint fix does not leave in implicit casts from a new return type.
+ */
+@SuppressWarnings("unused")
+public abstract class AutofixUnsafeCallWithImplicitReturnCast {
+    /**
+     * This method creates an AdaptiveIconDrawable and implicitly casts it to Drawable.
+     */
+    @RequiresApi(26)
+    public Drawable createAdaptiveIconDrawableReturnDrawable() {
+        return new AdaptiveIconDrawable(null, null);
+    }
+
+    /**
+     * This method also creates an AdaptiveIconDrawable but does not cast it to Drawable.
+     */
+    @RequiresApi(26)
+    public AdaptiveIconDrawable createAndReturnAdaptiveIconDrawable() {
+        return new AdaptiveIconDrawable(null, null);
+    }
+
+    /**
+     * This calls a method returning an Icon and implicitly casts it to Object.
+     */
+    @RequiresApi(26)
+    public Object methodReturnsIconAsObject() {
+        return Icon.createWithAdaptiveBitmap(null);
+    }
+
+    /**
+     * This calls a method returning an Icon and returns it as an Icon.
+     */
+    @RequiresApi(26)
+    public Icon methodReturnsIconAsIcon() {
+        return Icon.createWithAdaptiveBitmap(null);
+    }
+
+    /**
+     * This uses the constructed value as Notification.Style in a method call.
+     */
+    @RequiresApi(24)
+    public void methodUsesStyleAsParam() {
+        useStyle(new Notification.DecoratedCustomViewStyle());
+    }
+
+    /**
+     * This is here so there's a method to use the DecoratedCustomViewStyle as a Style.
+     */
+    static boolean useStyle(Notification.Style style) {
+        return false;
+    }
+}
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..45c9c3e 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -46,6 +46,7 @@
 import com.intellij.psi.PsiClassType
 import com.intellij.psi.PsiCompiledElement
 import com.intellij.psi.PsiElement
+import com.intellij.psi.PsiEllipsisType
 import com.intellij.psi.PsiExpressionList
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.PsiMethodCallExpression
@@ -67,6 +68,7 @@
 import org.jetbrains.uast.UThisExpression
 import org.jetbrains.uast.getContainingUClass
 import org.jetbrains.uast.getContainingUMethod
+import org.jetbrains.uast.isNullLiteral
 import org.jetbrains.uast.util.isConstructorCall
 import org.jetbrains.uast.util.isMethodCall
 
@@ -202,8 +204,7 @@
                 ?: return
 
             // Change: Removed SimpleDateFormat and Animator checks
-
-            var api = apiDatabase.getMethodVersion(owner, name, desc)
+            var api = apiDatabase.getMethodVersions(owner, name, desc).min()
             if (api == -1) {
                 return
             }
@@ -260,9 +261,9 @@
                             for (type in inheritanceChain) {
                                 val expressionOwner = evaluator.getQualifiedName(type)
                                 if (expressionOwner != null && expressionOwner != owner) {
-                                    val specificApi = apiDatabase.getMethodVersion(
+                                    val specificApi = apiDatabase.getMethodVersions(
                                         expressionOwner, name, desc
-                                    )
+                                    ).min()
                                     if (specificApi == -1) {
                                         if (apiDatabase.isRelevantOwner(expressionOwner)) {
                                             return
@@ -340,7 +341,7 @@
                             break
                         }
                         val specificApi =
-                            apiDatabase.getMethodVersion(expressionOwner, name, desc)
+                            apiDatabase.getMethodVersions(expressionOwner, name, desc).min()
                         if (specificApi == -1) {
                             if (apiDatabase.isRelevantOwner(expressionOwner)) {
                                 break
@@ -385,9 +386,9 @@
                                 if (provider != null) {
                                     val methodOwner = evaluator.getQualifiedName(provider)
                                     if (methodOwner != null) {
-                                        val methodApi = apiDatabase.getMethodVersion(
+                                        val methodApi = apiDatabase.getMethodVersions(
                                             methodOwner, name, desc
-                                        )
+                                        ).min()
                                         if (methodApi == -1 || methodApi <= minSdk) {
                                             // Yes, we found another call that doesn't have an API requirement
                                             return
@@ -529,7 +530,8 @@
                 call.receiver,
                 call.valueArguments,
                 wrapperClassName,
-                wrapperMethodName
+                wrapperMethodName,
+                wrapperMethodParams
             )
 
             val fix = fix()
@@ -685,6 +687,7 @@
          * @param callValueArguments Arguments of the call to the platform method
          * @param wrapperClassName Name of the generated wrapper class
          * @param wrapperMethodName Name of the generated wrapper method
+         * @param wrapperMethodParams Param types of the wrapper method
          * @return Source code for a call to the static wrapper method
          */
         private fun generateWrapperCall(
@@ -693,6 +696,7 @@
             callValueArguments: List<UExpression>,
             wrapperClassName: String,
             wrapperMethodName: String,
+            wrapperMethodParams: List<PsiType>
         ): String {
             val callReceiverStr = when {
                 // Static method
@@ -705,15 +709,34 @@
                 // it must be a call to an instance method using `this` implicitly.
                 callReceiver == null ->
                     "this"
-                // Otherwise, use the original call receiver string (removing extra parens)
+                // Use the original call receiver string (removing extra parens), casting if needed
                 else ->
-                    unwrapExpression(callReceiver).asSourceString()
+                    createArgumentString(unwrapExpression(callReceiver), wrapperMethodParams[0])
             }
 
             val callValues = if (callValueArguments.isNotEmpty()) {
-                callValueArguments.joinToString(separator = ", ") { argument ->
-                    argument.asSourceString()
+                // The first element in the wrapperMethodParams is the receiver, so drop that.
+                // Also drop the last parameter, because it is special-cased later.
+                val paramTypesWithoutReceiverAndFinal = wrapperMethodParams.drop(1).dropLast(1)
+                // For varargs methods, what we care about for the last type is the type of each
+                // vararg, not the containing type.
+                val finalParamType = if (method.isVarArgs) {
+                    (wrapperMethodParams.last() as PsiEllipsisType).componentType
+                } else {
+                    wrapperMethodParams.last()
                 }
+
+                callValueArguments.mapIndexed { argIndex, arg ->
+                    // The number of args might be greater than the number of param types due to
+                    // varargs, repeat the final param type for all args after exhausting the
+                    // paramTypesWithoutReceiverAndFinal list.
+                    val expectedType = if (argIndex < paramTypesWithoutReceiverAndFinal.size) {
+                        paramTypesWithoutReceiverAndFinal[argIndex]
+                    } else {
+                        finalParamType
+                    }
+                    createArgumentString(arg, expectedType)
+                }.joinToString(separator = ", ")
             } else {
                 null
             }
@@ -724,6 +747,24 @@
         }
 
         /**
+         * Creates the string representation of an argument in the wrapper call. If the type of the
+         * arg is not identical to the parameter type of the wrapper method, casts to that type.
+         */
+        private fun createArgumentString(arg: UExpression, expectedType: PsiType): String {
+            val argType = arg.getExpressionType()
+            val expectedTypeText = expectedType.canonicalText
+            // If the arg is the expected type, use as normal, otherwise, cast to expected type.
+            // Uses text-base equality instead of directly comparing types because certain types
+            // (eq. java.lang.Class<T>) are not necessarily equal to instances of the same type.
+            // There isn't really a point in casting if the arg is null.
+            return if (argType?.equalsToText(expectedTypeText) == true || arg.isNullLiteral()) {
+                arg.asSourceString()
+            } else {
+                "($expectedTypeText) ${arg.asSourceString()}"
+            }
+        }
+
+        /**
          * Remove parentheses from the expression (unwrap the expression until it is no longer a
          * UParenthesizedExpression).
          */
@@ -853,7 +894,7 @@
         private fun classAvailableAtMinSdk(className: String): Boolean {
             val apiDatabase = apiDatabase ?: return false
             val minSdk = getMinSdk(context)
-            val version = apiDatabase.getClassVersion(className)
+            val version = apiDatabase.getClassVersions(className).min()
             return version <= minSdk
         }
 
diff --git a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
index 55398d8..50af7de 100644
--- a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
@@ -82,7 +82,7 @@
 Fix for src/androidx/sample/core/widget/ListViewCompat.java line 39: Extract to static inner class:
 @@ -39 +39
 -             listView.scrollListBy(y);
-+             Api19Impl.scrollListBy(listView, y);
++             Api19Impl.scrollListBy((android.widget.AbsListView) listView, y);
 @@ -91 +91
 + @androidx.annotation.RequiresApi(19)
 + static class Api19Impl {
@@ -95,12 +95,11 @@
 +         absListView.scrollListBy(y);
 +     }
 +
-@@ -92 +103
 + }
 Fix for src/androidx/sample/core/widget/ListViewCompat.java line 69: Extract to static inner class:
 @@ -69 +69
 -             return listView.canScrollList(direction);
-+             return Api19Impl.canScrollList(listView, direction);
++             return Api19Impl.canScrollList((android.widget.AbsListView) listView, direction);
 @@ -91 +91
 + @androidx.annotation.RequiresApi(19)
 + static class Api19Impl {
@@ -113,7 +112,6 @@
 +         return absListView.canScrollList(direction);
 +     }
 +
-@@ -92 +103
 + }
         """.trimIndent()
         /* ktlint-enable max-line-length */
@@ -525,12 +523,11 @@
 +         return viewGroup.getClipToPadding();
 +     }
 +
-@@ -61 +72
 + }
 Fix for src/androidx/AutofixUnsafeCallToThis.java line 48: Extract to static inner class:
 @@ -48 +48
 -             this.getClipToPadding();
-+             Api21Impl.getClipToPadding(this);
++             Api21Impl.getClipToPadding((ViewGroup) this);
 @@ -60 +60
 + @androidx.annotation.RequiresApi(21)
 + static class Api21Impl {
@@ -543,7 +540,6 @@
 +         return viewGroup.getClipToPadding();
 +     }
 +
-@@ -61 +72
 + }
 Fix for src/androidx/AutofixUnsafeCallToThis.java line 57: Extract to static inner class:
 @@ -57 +57
@@ -561,7 +557,6 @@
 +         return viewGroup.getClipToPadding();
 +     }
 +
-@@ -61 +72
 + }
         """
         /* ktlint-enable max-line-length */
@@ -609,34 +604,34 @@
     }
 
     @Test
-    fun `Auto-fix with implicit class cast from new type (issue 214389795)`() {
+    fun `Auto-fix with implicit class cast from new return type (issue 214389795)`() {
         val input = arrayOf(
-            javaSample("androidx.AutofixUnsafeCallWithImplicitCast"),
+            javaSample("androidx.AutofixUnsafeCallWithImplicitReturnCast"),
             RequiresApi
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
-src/androidx/AutofixUnsafeCallWithImplicitCast.java:36: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java:36: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitReturnCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
         return new AdaptiveIconDrawable(null, null);
                ~~~~~~~~~~~~~~~~~~~~~~~~
-src/androidx/AutofixUnsafeCallWithImplicitCast.java:44: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java:44: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitReturnCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
         return new AdaptiveIconDrawable(null, null);
                ~~~~~~~~~~~~~~~~~~~~~~~~
-src/androidx/AutofixUnsafeCallWithImplicitCast.java:52: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java:52: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitReturnCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
         return Icon.createWithAdaptiveBitmap(null);
                     ~~~~~~~~~~~~~~~~~~~~~~~~
-src/androidx/AutofixUnsafeCallWithImplicitCast.java:60: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java:60: Error: This call references a method added in API level 26; however, the containing class androidx.AutofixUnsafeCallWithImplicitReturnCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
         return Icon.createWithAdaptiveBitmap(null);
                     ~~~~~~~~~~~~~~~~~~~~~~~~
-src/androidx/AutofixUnsafeCallWithImplicitCast.java:68: Error: This call references a method added in API level 24; however, the containing class androidx.AutofixUnsafeCallWithImplicitCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java:68: Error: This call references a method added in API level 24; however, the containing class androidx.AutofixUnsafeCallWithImplicitReturnCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
         useStyle(new Notification.DecoratedCustomViewStyle());
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 5 errors, 0 warnings
         """
 
         val expectedFix = """
-Fix for src/androidx/AutofixUnsafeCallWithImplicitCast.java line 36: Extract to static inner class:
+Fix for src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java line 36: Extract to static inner class:
 @@ -36 +36
 -         return new AdaptiveIconDrawable(null, null);
 +         return Api26Impl.createAdaptiveIconDrawableReturnsDrawable(null, null);
@@ -654,7 +649,7 @@
 +
 @@ -78 +89
 + }
-Fix for src/androidx/AutofixUnsafeCallWithImplicitCast.java line 44: Extract to static inner class:
+Fix for src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java line 44: Extract to static inner class:
 @@ -44 +44
 -         return new AdaptiveIconDrawable(null, null);
 +         return Api26Impl.createAdaptiveIconDrawable(null, null);
@@ -672,7 +667,7 @@
 +
 @@ -78 +89
 + }
-Fix for src/androidx/AutofixUnsafeCallWithImplicitCast.java line 52: Extract to static inner class:
+Fix for src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java line 52: Extract to static inner class:
 @@ -52 +52
 -         return Icon.createWithAdaptiveBitmap(null);
 +         return Api26Impl.createWithAdaptiveBitmapReturnsObject(null);
@@ -690,7 +685,7 @@
 +
 @@ -78 +89
 + }
-Fix for src/androidx/AutofixUnsafeCallWithImplicitCast.java line 60: Extract to static inner class:
+Fix for src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java line 60: Extract to static inner class:
 @@ -60 +60
 -         return Icon.createWithAdaptiveBitmap(null);
 +         return Api26Impl.createWithAdaptiveBitmap(null);
@@ -708,7 +703,7 @@
 +
 @@ -78 +89
 + }
-Fix for src/androidx/AutofixUnsafeCallWithImplicitCast.java line 68: Extract to static inner class:
+Fix for src/androidx/AutofixUnsafeCallWithImplicitReturnCast.java line 68: Extract to static inner class:
 @@ -68 +68
 -         useStyle(new Notification.DecoratedCustomViewStyle());
 +         useStyle(Api24Impl.createDecoratedCustomViewStyleReturnsStyle());
@@ -769,4 +764,140 @@
 
         check(*input).expect(expected).expectFixDiffs(expectedFix)
     }
+
+    @Test
+    fun `Auto-fix with implicit class cast from new parameter type (issue 266845827)`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeCallWithImplicitParamCast"),
+            RequiresApi
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/androidx/AutofixUnsafeCallWithImplicitParamCast.java:34: Error: This call references a method added in API level 16; however, the containing class androidx.AutofixUnsafeCallWithImplicitParamCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        style.setBuilder(builder);
+              ~~~~~~~~~~
+src/androidx/AutofixUnsafeCallWithImplicitParamCast.java:43: Error: This call references a method added in API level 20; however, the containing class androidx.AutofixUnsafeCallWithImplicitParamCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        builder.extend(extender);
+                ~~~~~~
+2 errors, 0 warnings
+        """
+
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeCallWithImplicitParamCast.java line 34: Extract to static inner class:
+@@ -34 +34
+-         style.setBuilder(builder);
++         Api16Impl.setBuilder((Notification.Style) style, builder);
+@@ -45 +45
++ @RequiresApi(16)
++ static class Api16Impl {
++     private Api16Impl() {
++         // This class is not instantiable.
++     }
++
++     @DoNotInline
++     static void setBuilder(Notification.Style style, Notification.Builder builder) {
++         style.setBuilder(builder);
++     }
++
++ }
+Fix for src/androidx/AutofixUnsafeCallWithImplicitParamCast.java line 43: Extract to static inner class:
+@@ -43 +43
+-         builder.extend(extender);
++         Api20Impl.extend(builder, (Notification.Extender) extender);
++ @RequiresApi(20)
++ static class Api20Impl {
++     private Api20Impl() {
++         // This class is not instantiable.
++     }
++
++     @DoNotInline
++     static Notification.Builder extend(Notification.Builder builder, Notification.Extender extender) {
++         return builder.extend(extender);
++     }
++
++ }
+        """
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix for method with varargs that are implicitly cast (issue 266845827)`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixOnUnsafeCallWithImplicitVarArgsCast"),
+            RequiresApi
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java:35: Error: This call references a method added in API level 27; however, the containing class androidx.AutofixOnUnsafeCallWithImplicitVarArgsCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        adapter.setAutofillOptions();
+                ~~~~~~~~~~~~~~~~~~
+src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java:43: Error: This call references a method added in API level 27; however, the containing class androidx.AutofixOnUnsafeCallWithImplicitVarArgsCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        adapter.setAutofillOptions(vararg);
+                ~~~~~~~~~~~~~~~~~~
+src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java:52: Error: This call references a method added in API level 27; however, the containing class androidx.AutofixOnUnsafeCallWithImplicitVarArgsCast is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        adapter.setAutofillOptions(vararg1, vararg2, vararg3);
+                ~~~~~~~~~~~~~~~~~~
+3 errors, 0 warnings
+        """
+
+        val expectedFix = """
+Fix for src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java line 35: Extract to static inner class:
+@@ -35 +35
+-         adapter.setAutofillOptions();
++         Api27Impl.setAutofillOptions(adapter);
+@@ -54 +54
++ @RequiresApi(27)
++ static class Api27Impl {
++     private Api27Impl() {
++         // This class is not instantiable.
++     }
++
++     @DoNotInline
++     static void setAutofillOptions(BaseAdapter baseAdapter, java.lang.CharSequence... options) {
++         baseAdapter.setAutofillOptions(options);
++     }
++
++ }
+Fix for src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java line 43: Extract to static inner class:
+@@ -43 +43
+-         adapter.setAutofillOptions(vararg);
++         Api27Impl.setAutofillOptions(adapter, (java.lang.CharSequence) vararg);
+@@ -54 +54
++ @RequiresApi(27)
++ static class Api27Impl {
++     private Api27Impl() {
++         // This class is not instantiable.
++     }
++
++     @DoNotInline
++     static void setAutofillOptions(BaseAdapter baseAdapter, java.lang.CharSequence... options) {
++         baseAdapter.setAutofillOptions(options);
++     }
++
++ }
+Fix for src/androidx/AutofixOnUnsafeCallWithImplicitVarArgsCast.java line 52: Extract to static inner class:
+@@ -52 +52
+-         adapter.setAutofillOptions(vararg1, vararg2, vararg3);
++         Api27Impl.setAutofillOptions(adapter, (java.lang.CharSequence) vararg1, (java.lang.CharSequence) vararg2, (java.lang.CharSequence) vararg3);
++ @RequiresApi(27)
++ static class Api27Impl {
++     private Api27Impl() {
++         // This class is not instantiable.
++     }
++
++     @DoNotInline
++     static void setAutofillOptions(BaseAdapter baseAdapter, java.lang.CharSequence... options) {
++         baseAdapter.setAutofillOptions(options);
++     }
++
++ }
+        """
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected).expectFixDiffs(expectedFix)
+    }
 }
diff --git a/lint-checks/src/test/java/androidx/build/lint/ExperimentalPropertyAnnotationDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/ExperimentalPropertyAnnotationDetectorTest.kt
index 5733f15..7da62dc 100644
--- a/lint-checks/src/test/java/androidx/build/lint/ExperimentalPropertyAnnotationDetectorTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/ExperimentalPropertyAnnotationDetectorTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.build.lint
 
-import com.android.tools.lint.checks.infrastructure.TestMode
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -127,7 +126,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -211,7 +209,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -296,7 +293,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -395,7 +391,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -435,7 +430,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -479,7 +473,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
@@ -520,7 +513,6 @@
                 *stubs,
                 *input
             )
-            .skipTestModes(TestMode.SUPPRESSIBLE) // b/257294309
             .run()
             .expect(expected)
             .expectFixDiffs(expectedFixDiffs)
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/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/OWNERS b/navigation/OWNERS
index bf053cd..ec2387e6 100644
--- a/navigation/OWNERS
+++ b/navigation/OWNERS
@@ -1,4 +1,4 @@
-# Bug component: 409828
+# Bug component: 606741
 ilake@google.com
 jbwoods@google.com
 danysantiago@google.com
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 067e9f2..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();
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index 067e9f2..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();
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 067e9f2..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();
diff --git a/navigation/navigation-common/build.gradle b/navigation/navigation-common/build.gradle
index 9f6e589..bf8a159 100644
--- a/navigation/navigation-common/build.gradle
+++ b/navigation/navigation-common/build.gradle
@@ -41,6 +41,7 @@
     api(project(":lifecycle:lifecycle-viewmodel-savedstate"))
     implementation("androidx.core:core-ktx:1.1.0")
     implementation("androidx.collection:collection-ktx:1.1.0")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
 
     api(libs.kotlinStdlib)
     testImplementation(project(":navigation:navigation-testing"))
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/samples/build.gradle b/navigation/navigation-compose/samples/build.gradle
index 8ee9740..4cc57c0 100644
--- a/navigation/navigation-compose/samples/build.gradle
+++ b/navigation/navigation-compose/samples/build.gradle
@@ -30,6 +30,7 @@
 
     compileOnly(projectOrArtifact(":annotation:annotation-sampled"))
     implementation("androidx.compose.foundation:foundation:1.0.1")
+    implementation projectOrArtifact(":compose:ui:ui-tooling")
     implementation(projectOrArtifact(":navigation:navigation-compose"))
     implementation("androidx.compose.material:material:1.0.1")
     implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1")
diff --git a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
index d38c258..4cc5ef4 100644
--- a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
+++ b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
@@ -21,6 +21,7 @@
 import androidx.annotation.Sampled
 import androidx.annotation.StringRes
 import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
@@ -35,11 +36,15 @@
 import androidx.compose.material.Scaffold
 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.graphics.Color.Companion.LightGray
+import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.navigation.NavController
@@ -242,6 +247,27 @@
     }
 }
 
+@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"))
+                    }
+                }
+            }
+        }
+    }
+}
+
 private val phrases = listOf(
     "Easy As Pie",
     "Wouldn't Harm a Fly",
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/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
index 006962f..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
@@ -563,10 +563,10 @@
 
         val options = navOptions {
             anim {
-                enter = androidx.fragment.R.animator.fragment_fade_enter
-                exit = androidx.fragment.R.animator.fragment_fade_exit
-                popEnter = androidx.fragment.R.animator.fragment_fade_enter
-                popExit = androidx.fragment.R.animator.fragment_fade_exit
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
             }
         }
 
@@ -639,10 +639,10 @@
 
         val options = navOptions {
             anim {
-                enter = androidx.fragment.R.animator.fragment_fade_enter
-                exit = androidx.fragment.R.animator.fragment_fade_exit
-                popEnter = androidx.fragment.R.animator.fragment_fade_enter
-                popExit = androidx.fragment.R.animator.fragment_fade_exit
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
             }
         }
 
@@ -706,10 +706,10 @@
 
         val options = navOptions {
             anim {
-                enter = androidx.fragment.R.animator.fragment_fade_enter
-                exit = androidx.fragment.R.animator.fragment_fade_exit
-                popEnter = androidx.fragment.R.animator.fragment_fade_enter
-                popExit = androidx.fragment.R.animator.fragment_fade_exit
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
             }
         }
         activityRule.runOnUiThread {
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-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/api/current.txt b/navigation/navigation-runtime/api/current.txt
index 735c94d..39d9a7f 100644
--- a/navigation/navigation-runtime/api/current.txt
+++ b/navigation/navigation-runtime/api/current.txt
@@ -119,10 +119,10 @@
     method @MainThread public void navigate(androidx.navigation.NavDirections directions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
-    method public final void navigate(String route);
+    method @MainThread public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method @MainThread public final void navigate(String route);
     method @MainThread public boolean navigateUp();
     method @MainThread public boolean popBackStack();
     method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
index 217af43..6faf37c 100644
--- a/navigation/navigation-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
@@ -120,10 +120,10 @@
     method @MainThread public void navigate(androidx.navigation.NavDirections directions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
-    method public final void navigate(String route);
+    method @MainThread public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method @MainThread public final void navigate(String route);
     method @MainThread public boolean navigateUp();
     method @MainThread public boolean popBackStack();
     method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
diff --git a/navigation/navigation-runtime/api/restricted_current.txt b/navigation/navigation-runtime/api/restricted_current.txt
index 735c94d..39d9a7f 100644
--- a/navigation/navigation-runtime/api/restricted_current.txt
+++ b/navigation/navigation-runtime/api/restricted_current.txt
@@ -119,10 +119,10 @@
     method @MainThread public void navigate(androidx.navigation.NavDirections directions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
     method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
-    method public final void navigate(String route);
+    method @MainThread public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method @MainThread public final void navigate(String route);
     method @MainThread public boolean navigateUp();
     method @MainThread public boolean popBackStack();
     method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
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 5256f92..5a1b31d 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -2148,6 +2148,7 @@
      *
      * @throws IllegalArgumentException if the given route is invalid
      */
+    @MainThread
     public fun navigate(route: String, builder: NavOptionsBuilder.() -> Unit) {
         navigate(route, navOptions(builder))
     }
@@ -2162,6 +2163,7 @@
      *
      * @throws IllegalArgumentException if the given route is invalid
      */
+    @MainThread
     @JvmOverloads
     public fun navigate(
         route: String,
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-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/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/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/ads/ads-adservices-java/api/1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices-java/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..26eea8b
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices-java/api/1.0.0-beta01.txt
@@ -0,0 +1,92 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.java.adid {
+
+  public abstract class AdIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adid.AdId> getAdIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AdIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.adselection {
+
+  public abstract class AdSelectionManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> reportImpressionAsync(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome> selectAdsAsync(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    field public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures.Companion Companion;
+  }
+
+  public static final class AdSelectionManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.appsetid {
+
+  public abstract class AppSetIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.appsetid.AppSetId> getAppSetIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AppSetIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.customaudience {
+
+  public abstract class CustomAudienceManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> joinCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> leaveCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures.Companion Companion;
+  }
+
+  public static final class CustomAudienceManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.measurement {
+
+  public abstract class MeasurementManagerFutures {
+    method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> deleteRegistrationsAsync(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest);
+    method public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> getMeasurementApiStatusAsync();
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerSourceAsync(android.net.Uri attributionSource, android.view.InputEvent? inputEvent);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerTriggerAsync(android.net.Uri trigger);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebSourceAsync(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebTriggerAsync(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures.Companion Companion;
+  }
+
+  public static final class MeasurementManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.topics {
+
+  public abstract class TopicsManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse> getTopicsAsync(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures.Companion Companion;
+  }
+
+  public static final class TopicsManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices-java/api/public_plus_experimental_1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices-java/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..26eea8b
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices-java/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,92 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.java.adid {
+
+  public abstract class AdIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adid.AdId> getAdIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AdIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.adselection {
+
+  public abstract class AdSelectionManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> reportImpressionAsync(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome> selectAdsAsync(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    field public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures.Companion Companion;
+  }
+
+  public static final class AdSelectionManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.appsetid {
+
+  public abstract class AppSetIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.appsetid.AppSetId> getAppSetIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AppSetIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.customaudience {
+
+  public abstract class CustomAudienceManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> joinCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> leaveCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures.Companion Companion;
+  }
+
+  public static final class CustomAudienceManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.measurement {
+
+  public abstract class MeasurementManagerFutures {
+    method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> deleteRegistrationsAsync(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest);
+    method public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> getMeasurementApiStatusAsync();
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerSourceAsync(android.net.Uri attributionSource, android.view.InputEvent? inputEvent);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerTriggerAsync(android.net.Uri trigger);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebSourceAsync(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebTriggerAsync(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures.Companion Companion;
+  }
+
+  public static final class MeasurementManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.topics {
+
+  public abstract class TopicsManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse> getTopicsAsync(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures.Companion Companion;
+  }
+
+  public static final class TopicsManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices-java/api/res-1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices-java/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices-java/api/res-1.0.0-beta01.txt
diff --git a/privacysandbox/ads/ads-adservices-java/api/restricted_1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices-java/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..26eea8b
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices-java/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,92 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.java.adid {
+
+  public abstract class AdIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adid.AdId> getAdIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AdIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adid.AdIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.adselection {
+
+  public abstract class AdSelectionManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> reportImpressionAsync(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome> selectAdsAsync(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    field public static final androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures.Companion Companion;
+  }
+
+  public static final class AdSelectionManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.adselection.AdSelectionManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.appsetid {
+
+  public abstract class AppSetIdManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.appsetid.AppSetId> getAppSetIdAsync();
+    field public static final androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures.Companion Companion;
+  }
+
+  public static final class AppSetIdManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.appsetid.AppSetIdManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.customaudience {
+
+  public abstract class CustomAudienceManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> joinCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> leaveCustomAudienceAsync(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures.Companion Companion;
+  }
+
+  public static final class CustomAudienceManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.customaudience.CustomAudienceManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.measurement {
+
+  public abstract class MeasurementManagerFutures {
+    method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> deleteRegistrationsAsync(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest);
+    method public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Integer> getMeasurementApiStatusAsync();
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerSourceAsync(android.net.Uri attributionSource, android.view.InputEvent? inputEvent);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerTriggerAsync(android.net.Uri trigger);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebSourceAsync(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> registerWebTriggerAsync(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures.Companion Companion;
+  }
+
+  public static final class MeasurementManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures? from(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.java.topics {
+
+  public abstract class TopicsManagerFutures {
+    method public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract com.google.common.util.concurrent.ListenableFuture<androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse> getTopicsAsync(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request);
+    field public static final androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures.Companion Companion;
+  }
+
+  public static final class TopicsManagerFutures.Companion {
+    method public androidx.privacysandbox.ads.adservices.java.topics.TopicsManagerFutures? from(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices/api/1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..30cd307
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices/api/1.0.0-beta01.txt
@@ -0,0 +1,345 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.adid {
+
+  public final class AdId {
+    method public String getAdId();
+    method public boolean isLimitAdTrackingEnabled();
+    property public final String adId;
+    property public final boolean isLimitAdTrackingEnabled;
+  }
+
+  public abstract class AdIdManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract suspend Object? getAdId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adid.AdId>);
+    method public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager.Companion Companion;
+  }
+
+  public static final class AdIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.adselection {
+
+  public final class AdSelectionConfig {
+    ctor public AdSelectionConfig(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller, android.net.Uri decisionLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals, java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals, android.net.Uri trustedScoringSignalsUri);
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getAdSelectionSignals();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> getCustomAudienceBuyers();
+    method public android.net.Uri getDecisionLogicUri();
+    method public java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> getPerBuyerSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getSeller();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getSellerSignals();
+    method public android.net.Uri getTrustedScoringSignalsUri();
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers;
+    property public final android.net.Uri decisionLogicUri;
+    property public final java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals;
+    property public final android.net.Uri trustedScoringSignalsUri;
+  }
+
+  public abstract class AdSelectionManager {
+    method public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? reportImpression(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? selectAds(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome>);
+    field public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager.Companion Companion;
+  }
+
+  public static final class AdSelectionManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+  }
+
+  public final class AdSelectionOutcome {
+    ctor public AdSelectionOutcome(long adSelectionId, android.net.Uri renderUri);
+    method public long getAdSelectionId();
+    method public android.net.Uri getRenderUri();
+    property public final long adSelectionId;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class ReportImpressionRequest {
+    ctor public ReportImpressionRequest(long adSelectionId, androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig getAdSelectionConfig();
+    method public long getAdSelectionId();
+    property public final androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig;
+    property public final long adSelectionId;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.appsetid {
+
+  public final class AppSetId {
+    ctor public AppSetId(String id, int scope);
+    method public String getId();
+    method public int getScope();
+    property public final String id;
+    property public final int scope;
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetId.Companion Companion;
+    field public static final int SCOPE_APP = 1; // 0x1
+    field public static final int SCOPE_DEVELOPER = 2; // 0x2
+  }
+
+  public static final class AppSetId.Companion {
+  }
+
+  public abstract class AppSetIdManager {
+    method public abstract suspend Object? getAppSetId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.appsetid.AppSetId>);
+    method public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager.Companion Companion;
+  }
+
+  public static final class AppSetIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.common {
+
+  public final class AdData {
+    ctor public AdData(android.net.Uri renderUri, String metadata);
+    method public String getMetadata();
+    method public android.net.Uri getRenderUri();
+    property public final String metadata;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class AdSelectionSignals {
+    ctor public AdSelectionSignals(String signals);
+    method public String getSignals();
+    property public final String signals;
+  }
+
+  public final class AdTechIdentifier {
+    ctor public AdTechIdentifier(String identifier);
+    method public String getIdentifier();
+    property public final String identifier;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.customaudience {
+
+  public final class CustomAudience {
+    ctor public CustomAudience(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads, optional java.time.Instant? activationTime, optional java.time.Instant? expirationTime, optional androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals, optional androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals);
+    method public java.time.Instant? getActivationTime();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> getAds();
+    method public android.net.Uri getBiddingLogicUri();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public android.net.Uri getDailyUpdateUri();
+    method public java.time.Instant? getExpirationTime();
+    method public String getName();
+    method public androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? getTrustedBiddingSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? getUserBiddingSignals();
+    property public final java.time.Instant? activationTime;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads;
+    property public final android.net.Uri biddingLogicUri;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final android.net.Uri dailyUpdateUri;
+    property public final java.time.Instant? expirationTime;
+    property public final String name;
+    property public final androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals;
+  }
+
+  public static final class CustomAudience.Builder {
+    ctor public CustomAudience.Builder(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience build();
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setActivationTime(java.time.Instant activationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setAds(java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBiddingLogicUri(android.net.Uri biddingLogicUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBuyer(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setDailyUpdateUri(android.net.Uri dailyUpdateUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setExpirationTime(java.time.Instant expirationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setName(String name);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setTrustedBiddingData(androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData trustedBiddingSignals);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setUserBiddingSignals(androidx.privacysandbox.ads.adservices.common.AdSelectionSignals userBiddingSignals);
+  }
+
+  public abstract class CustomAudienceManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? joinCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? leaveCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager.Companion Companion;
+  }
+
+  public static final class CustomAudienceManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+  }
+
+  public final class JoinCustomAudienceRequest {
+    ctor public JoinCustomAudienceRequest(androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience getCustomAudience();
+    property public final androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience;
+  }
+
+  public final class LeaveCustomAudienceRequest {
+    ctor public LeaveCustomAudienceRequest(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name);
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public String getName();
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final String name;
+  }
+
+  public final class TrustedBiddingData {
+    ctor public TrustedBiddingData(android.net.Uri trustedBiddingUri, java.util.List<java.lang.String> trustedBiddingKeys);
+    method public java.util.List<java.lang.String> getTrustedBiddingKeys();
+    method public android.net.Uri getTrustedBiddingUri();
+    property public final java.util.List<java.lang.String> trustedBiddingKeys;
+    property public final android.net.Uri trustedBiddingUri;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.measurement {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class DeletionRequest {
+    ctor public DeletionRequest(int deletionMode, int matchBehavior, optional java.time.Instant start, optional java.time.Instant end, optional java.util.List<? extends android.net.Uri> domainUris, optional java.util.List<? extends android.net.Uri> originUris);
+    method public int getDeletionMode();
+    method public java.util.List<android.net.Uri> getDomainUris();
+    method public java.time.Instant getEnd();
+    method public int getMatchBehavior();
+    method public java.util.List<android.net.Uri> getOriginUris();
+    method public java.time.Instant getStart();
+    property public final int deletionMode;
+    property public final java.util.List<android.net.Uri> domainUris;
+    property public final java.time.Instant end;
+    property public final int matchBehavior;
+    property public final java.util.List<android.net.Uri> originUris;
+    property public final java.time.Instant start;
+    field public static final androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Companion Companion;
+    field public static final int DELETION_MODE_ALL = 0; // 0x0
+    field public static final int DELETION_MODE_EXCLUDE_INTERNAL_DATA = 1; // 0x1
+    field public static final int MATCH_BEHAVIOR_DELETE = 0; // 0x0
+    field public static final int MATCH_BEHAVIOR_PRESERVE = 1; // 0x1
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class DeletionRequest.Builder {
+    ctor public DeletionRequest.Builder(int deletionMode, int matchBehavior);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setDomainUris(java.util.List<? extends android.net.Uri> domainUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setEnd(java.time.Instant end);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setOriginUris(java.util.List<? extends android.net.Uri> originUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setStart(java.time.Instant start);
+  }
+
+  public static final class DeletionRequest.Companion {
+  }
+
+  public abstract class MeasurementManager {
+    ctor public MeasurementManager();
+    method public abstract suspend Object? deleteRegistrations(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? getMeasurementApiStatus(kotlin.coroutines.Continuation<? super java.lang.Integer>);
+    method public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerSource(android.net.Uri attributionSource, android.view.InputEvent? inputEvent, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerTrigger(android.net.Uri trigger, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebSource(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebTrigger(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    field public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager.Companion Companion;
+    field public static final int MEASUREMENT_API_STATE_DISABLED = 0; // 0x0
+    field public static final int MEASUREMENT_API_STATE_ENABLED = 1; // 0x1
+  }
+
+  public static final class MeasurementManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceParams {
+    ctor public WebSourceParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceRegistrationRequest {
+    ctor public WebSourceRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri, optional android.view.InputEvent? inputEvent, optional android.net.Uri? appDestination, optional android.net.Uri? webDestination, optional android.net.Uri? verifiedDestination);
+    method public android.net.Uri? getAppDestination();
+    method public android.view.InputEvent? getInputEvent();
+    method public android.net.Uri getTopOriginUri();
+    method public android.net.Uri? getVerifiedDestination();
+    method public android.net.Uri? getWebDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> getWebSourceParams();
+    property public final android.net.Uri? appDestination;
+    property public final android.view.InputEvent? inputEvent;
+    property public final android.net.Uri topOriginUri;
+    property public final android.net.Uri? verifiedDestination;
+    property public final android.net.Uri? webDestination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams;
+  }
+
+  public static final class WebSourceRegistrationRequest.Builder {
+    ctor public WebSourceRegistrationRequest.Builder(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setAppDestination(android.net.Uri? appDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setInputEvent(android.view.InputEvent inputEvent);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setVerifiedDestination(android.net.Uri? verifiedDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setWebDestination(android.net.Uri? webDestination);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerParams {
+    ctor public WebTriggerParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerRegistrationRequest {
+    ctor public WebTriggerRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams, android.net.Uri destination);
+    method public android.net.Uri getDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> getWebTriggerParams();
+    property public final android.net.Uri destination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.topics {
+
+  public final class GetTopicsRequest {
+    ctor public GetTopicsRequest(optional String adsSdkName, optional boolean shouldRecordObservation);
+    method public String getAdsSdkName();
+    method public boolean getShouldRecordObservation();
+    property public final String adsSdkName;
+    property public final boolean shouldRecordObservation;
+  }
+
+  public static final class GetTopicsRequest.Builder {
+    ctor public GetTopicsRequest.Builder();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest build();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setAdsSdkName(String adsSdkName);
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setShouldRecordObservation(boolean shouldRecordObservation);
+  }
+
+  public final class GetTopicsResponse {
+    ctor public GetTopicsResponse(java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics);
+    method public java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> getTopics();
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics;
+  }
+
+  public final class Topic {
+    ctor public Topic(long taxonomyVersion, long modelVersion, int topicId);
+    method public long getModelVersion();
+    method public long getTaxonomyVersion();
+    method public int getTopicId();
+    property public final long modelVersion;
+    property public final long taxonomyVersion;
+    property public final int topicId;
+  }
+
+  public abstract class TopicsManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract suspend Object? getTopics(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse>);
+    method public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager.Companion Companion;
+  }
+
+  public static final class TopicsManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices/api/public_plus_experimental_1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..30cd307
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,345 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.adid {
+
+  public final class AdId {
+    method public String getAdId();
+    method public boolean isLimitAdTrackingEnabled();
+    property public final String adId;
+    property public final boolean isLimitAdTrackingEnabled;
+  }
+
+  public abstract class AdIdManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract suspend Object? getAdId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adid.AdId>);
+    method public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager.Companion Companion;
+  }
+
+  public static final class AdIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.adselection {
+
+  public final class AdSelectionConfig {
+    ctor public AdSelectionConfig(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller, android.net.Uri decisionLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals, java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals, android.net.Uri trustedScoringSignalsUri);
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getAdSelectionSignals();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> getCustomAudienceBuyers();
+    method public android.net.Uri getDecisionLogicUri();
+    method public java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> getPerBuyerSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getSeller();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getSellerSignals();
+    method public android.net.Uri getTrustedScoringSignalsUri();
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers;
+    property public final android.net.Uri decisionLogicUri;
+    property public final java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals;
+    property public final android.net.Uri trustedScoringSignalsUri;
+  }
+
+  public abstract class AdSelectionManager {
+    method public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? reportImpression(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? selectAds(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome>);
+    field public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager.Companion Companion;
+  }
+
+  public static final class AdSelectionManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+  }
+
+  public final class AdSelectionOutcome {
+    ctor public AdSelectionOutcome(long adSelectionId, android.net.Uri renderUri);
+    method public long getAdSelectionId();
+    method public android.net.Uri getRenderUri();
+    property public final long adSelectionId;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class ReportImpressionRequest {
+    ctor public ReportImpressionRequest(long adSelectionId, androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig getAdSelectionConfig();
+    method public long getAdSelectionId();
+    property public final androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig;
+    property public final long adSelectionId;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.appsetid {
+
+  public final class AppSetId {
+    ctor public AppSetId(String id, int scope);
+    method public String getId();
+    method public int getScope();
+    property public final String id;
+    property public final int scope;
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetId.Companion Companion;
+    field public static final int SCOPE_APP = 1; // 0x1
+    field public static final int SCOPE_DEVELOPER = 2; // 0x2
+  }
+
+  public static final class AppSetId.Companion {
+  }
+
+  public abstract class AppSetIdManager {
+    method public abstract suspend Object? getAppSetId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.appsetid.AppSetId>);
+    method public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager.Companion Companion;
+  }
+
+  public static final class AppSetIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.common {
+
+  public final class AdData {
+    ctor public AdData(android.net.Uri renderUri, String metadata);
+    method public String getMetadata();
+    method public android.net.Uri getRenderUri();
+    property public final String metadata;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class AdSelectionSignals {
+    ctor public AdSelectionSignals(String signals);
+    method public String getSignals();
+    property public final String signals;
+  }
+
+  public final class AdTechIdentifier {
+    ctor public AdTechIdentifier(String identifier);
+    method public String getIdentifier();
+    property public final String identifier;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.customaudience {
+
+  public final class CustomAudience {
+    ctor public CustomAudience(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads, optional java.time.Instant? activationTime, optional java.time.Instant? expirationTime, optional androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals, optional androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals);
+    method public java.time.Instant? getActivationTime();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> getAds();
+    method public android.net.Uri getBiddingLogicUri();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public android.net.Uri getDailyUpdateUri();
+    method public java.time.Instant? getExpirationTime();
+    method public String getName();
+    method public androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? getTrustedBiddingSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? getUserBiddingSignals();
+    property public final java.time.Instant? activationTime;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads;
+    property public final android.net.Uri biddingLogicUri;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final android.net.Uri dailyUpdateUri;
+    property public final java.time.Instant? expirationTime;
+    property public final String name;
+    property public final androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals;
+  }
+
+  public static final class CustomAudience.Builder {
+    ctor public CustomAudience.Builder(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience build();
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setActivationTime(java.time.Instant activationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setAds(java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBiddingLogicUri(android.net.Uri biddingLogicUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBuyer(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setDailyUpdateUri(android.net.Uri dailyUpdateUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setExpirationTime(java.time.Instant expirationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setName(String name);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setTrustedBiddingData(androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData trustedBiddingSignals);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setUserBiddingSignals(androidx.privacysandbox.ads.adservices.common.AdSelectionSignals userBiddingSignals);
+  }
+
+  public abstract class CustomAudienceManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? joinCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? leaveCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager.Companion Companion;
+  }
+
+  public static final class CustomAudienceManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+  }
+
+  public final class JoinCustomAudienceRequest {
+    ctor public JoinCustomAudienceRequest(androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience getCustomAudience();
+    property public final androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience;
+  }
+
+  public final class LeaveCustomAudienceRequest {
+    ctor public LeaveCustomAudienceRequest(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name);
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public String getName();
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final String name;
+  }
+
+  public final class TrustedBiddingData {
+    ctor public TrustedBiddingData(android.net.Uri trustedBiddingUri, java.util.List<java.lang.String> trustedBiddingKeys);
+    method public java.util.List<java.lang.String> getTrustedBiddingKeys();
+    method public android.net.Uri getTrustedBiddingUri();
+    property public final java.util.List<java.lang.String> trustedBiddingKeys;
+    property public final android.net.Uri trustedBiddingUri;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.measurement {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class DeletionRequest {
+    ctor public DeletionRequest(int deletionMode, int matchBehavior, optional java.time.Instant start, optional java.time.Instant end, optional java.util.List<? extends android.net.Uri> domainUris, optional java.util.List<? extends android.net.Uri> originUris);
+    method public int getDeletionMode();
+    method public java.util.List<android.net.Uri> getDomainUris();
+    method public java.time.Instant getEnd();
+    method public int getMatchBehavior();
+    method public java.util.List<android.net.Uri> getOriginUris();
+    method public java.time.Instant getStart();
+    property public final int deletionMode;
+    property public final java.util.List<android.net.Uri> domainUris;
+    property public final java.time.Instant end;
+    property public final int matchBehavior;
+    property public final java.util.List<android.net.Uri> originUris;
+    property public final java.time.Instant start;
+    field public static final androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Companion Companion;
+    field public static final int DELETION_MODE_ALL = 0; // 0x0
+    field public static final int DELETION_MODE_EXCLUDE_INTERNAL_DATA = 1; // 0x1
+    field public static final int MATCH_BEHAVIOR_DELETE = 0; // 0x0
+    field public static final int MATCH_BEHAVIOR_PRESERVE = 1; // 0x1
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class DeletionRequest.Builder {
+    ctor public DeletionRequest.Builder(int deletionMode, int matchBehavior);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setDomainUris(java.util.List<? extends android.net.Uri> domainUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setEnd(java.time.Instant end);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setOriginUris(java.util.List<? extends android.net.Uri> originUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setStart(java.time.Instant start);
+  }
+
+  public static final class DeletionRequest.Companion {
+  }
+
+  public abstract class MeasurementManager {
+    ctor public MeasurementManager();
+    method public abstract suspend Object? deleteRegistrations(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? getMeasurementApiStatus(kotlin.coroutines.Continuation<? super java.lang.Integer>);
+    method public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerSource(android.net.Uri attributionSource, android.view.InputEvent? inputEvent, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerTrigger(android.net.Uri trigger, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebSource(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebTrigger(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    field public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager.Companion Companion;
+    field public static final int MEASUREMENT_API_STATE_DISABLED = 0; // 0x0
+    field public static final int MEASUREMENT_API_STATE_ENABLED = 1; // 0x1
+  }
+
+  public static final class MeasurementManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceParams {
+    ctor public WebSourceParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceRegistrationRequest {
+    ctor public WebSourceRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri, optional android.view.InputEvent? inputEvent, optional android.net.Uri? appDestination, optional android.net.Uri? webDestination, optional android.net.Uri? verifiedDestination);
+    method public android.net.Uri? getAppDestination();
+    method public android.view.InputEvent? getInputEvent();
+    method public android.net.Uri getTopOriginUri();
+    method public android.net.Uri? getVerifiedDestination();
+    method public android.net.Uri? getWebDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> getWebSourceParams();
+    property public final android.net.Uri? appDestination;
+    property public final android.view.InputEvent? inputEvent;
+    property public final android.net.Uri topOriginUri;
+    property public final android.net.Uri? verifiedDestination;
+    property public final android.net.Uri? webDestination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams;
+  }
+
+  public static final class WebSourceRegistrationRequest.Builder {
+    ctor public WebSourceRegistrationRequest.Builder(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setAppDestination(android.net.Uri? appDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setInputEvent(android.view.InputEvent inputEvent);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setVerifiedDestination(android.net.Uri? verifiedDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setWebDestination(android.net.Uri? webDestination);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerParams {
+    ctor public WebTriggerParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerRegistrationRequest {
+    ctor public WebTriggerRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams, android.net.Uri destination);
+    method public android.net.Uri getDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> getWebTriggerParams();
+    property public final android.net.Uri destination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.topics {
+
+  public final class GetTopicsRequest {
+    ctor public GetTopicsRequest(optional String adsSdkName, optional boolean shouldRecordObservation);
+    method public String getAdsSdkName();
+    method public boolean getShouldRecordObservation();
+    property public final String adsSdkName;
+    property public final boolean shouldRecordObservation;
+  }
+
+  public static final class GetTopicsRequest.Builder {
+    ctor public GetTopicsRequest.Builder();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest build();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setAdsSdkName(String adsSdkName);
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setShouldRecordObservation(boolean shouldRecordObservation);
+  }
+
+  public final class GetTopicsResponse {
+    ctor public GetTopicsResponse(java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics);
+    method public java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> getTopics();
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics;
+  }
+
+  public final class Topic {
+    ctor public Topic(long taxonomyVersion, long modelVersion, int topicId);
+    method public long getModelVersion();
+    method public long getTaxonomyVersion();
+    method public int getTopicId();
+    property public final long modelVersion;
+    property public final long taxonomyVersion;
+    property public final int topicId;
+  }
+
+  public abstract class TopicsManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract suspend Object? getTopics(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse>);
+    method public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager.Companion Companion;
+  }
+
+  public static final class TopicsManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices/api/res-1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices/api/res-1.0.0-beta01.txt
diff --git a/privacysandbox/ads/ads-adservices/api/restricted_1.0.0-beta01.txt b/privacysandbox/ads/ads-adservices/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..30cd307
--- /dev/null
+++ b/privacysandbox/ads/ads-adservices/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,345 @@
+// Signature format: 4.0
+package androidx.privacysandbox.ads.adservices.adid {
+
+  public final class AdId {
+    method public String getAdId();
+    method public boolean isLimitAdTrackingEnabled();
+    property public final String adId;
+    property public final boolean isLimitAdTrackingEnabled;
+  }
+
+  public abstract class AdIdManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) public abstract suspend Object? getAdId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adid.AdId>);
+    method public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.adid.AdIdManager.Companion Companion;
+  }
+
+  public static final class AdIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adid.AdIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.adselection {
+
+  public final class AdSelectionConfig {
+    ctor public AdSelectionConfig(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller, android.net.Uri decisionLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals, androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals, java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals, android.net.Uri trustedScoringSignalsUri);
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getAdSelectionSignals();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> getCustomAudienceBuyers();
+    method public android.net.Uri getDecisionLogicUri();
+    method public java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> getPerBuyerSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getSeller();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals getSellerSignals();
+    method public android.net.Uri getTrustedScoringSignalsUri();
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals adSelectionSignals;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier> customAudienceBuyers;
+    property public final android.net.Uri decisionLogicUri;
+    property public final java.util.Map<androidx.privacysandbox.ads.adservices.common.AdTechIdentifier,androidx.privacysandbox.ads.adservices.common.AdSelectionSignals> perBuyerSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier seller;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals sellerSignals;
+    property public final android.net.Uri trustedScoringSignalsUri;
+  }
+
+  public abstract class AdSelectionManager {
+    method public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? reportImpression(androidx.privacysandbox.ads.adservices.adselection.ReportImpressionRequest reportImpressionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? selectAds(androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.adselection.AdSelectionOutcome>);
+    field public static final androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager.Companion Companion;
+  }
+
+  public static final class AdSelectionManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionManager? obtain(android.content.Context context);
+  }
+
+  public final class AdSelectionOutcome {
+    ctor public AdSelectionOutcome(long adSelectionId, android.net.Uri renderUri);
+    method public long getAdSelectionId();
+    method public android.net.Uri getRenderUri();
+    property public final long adSelectionId;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class ReportImpressionRequest {
+    ctor public ReportImpressionRequest(long adSelectionId, androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig);
+    method public androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig getAdSelectionConfig();
+    method public long getAdSelectionId();
+    property public final androidx.privacysandbox.ads.adservices.adselection.AdSelectionConfig adSelectionConfig;
+    property public final long adSelectionId;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.appsetid {
+
+  public final class AppSetId {
+    ctor public AppSetId(String id, int scope);
+    method public String getId();
+    method public int getScope();
+    property public final String id;
+    property public final int scope;
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetId.Companion Companion;
+    field public static final int SCOPE_APP = 1; // 0x1
+    field public static final int SCOPE_DEVELOPER = 2; // 0x2
+  }
+
+  public static final class AppSetId.Companion {
+  }
+
+  public abstract class AppSetIdManager {
+    method public abstract suspend Object? getAppSetId(kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.appsetid.AppSetId>);
+    method public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager.Companion Companion;
+  }
+
+  public static final class AppSetIdManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.appsetid.AppSetIdManager? obtain(android.content.Context context);
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.common {
+
+  public final class AdData {
+    ctor public AdData(android.net.Uri renderUri, String metadata);
+    method public String getMetadata();
+    method public android.net.Uri getRenderUri();
+    property public final String metadata;
+    property public final android.net.Uri renderUri;
+  }
+
+  public final class AdSelectionSignals {
+    ctor public AdSelectionSignals(String signals);
+    method public String getSignals();
+    property public final String signals;
+  }
+
+  public final class AdTechIdentifier {
+    ctor public AdTechIdentifier(String identifier);
+    method public String getIdentifier();
+    property public final String identifier;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.customaudience {
+
+  public final class CustomAudience {
+    ctor public CustomAudience(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads, optional java.time.Instant? activationTime, optional java.time.Instant? expirationTime, optional androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals, optional androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals);
+    method public java.time.Instant? getActivationTime();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> getAds();
+    method public android.net.Uri getBiddingLogicUri();
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public android.net.Uri getDailyUpdateUri();
+    method public java.time.Instant? getExpirationTime();
+    method public String getName();
+    method public androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? getTrustedBiddingSignals();
+    method public androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? getUserBiddingSignals();
+    property public final java.time.Instant? activationTime;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads;
+    property public final android.net.Uri biddingLogicUri;
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final android.net.Uri dailyUpdateUri;
+    property public final java.time.Instant? expirationTime;
+    property public final String name;
+    property public final androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData? trustedBiddingSignals;
+    property public final androidx.privacysandbox.ads.adservices.common.AdSelectionSignals? userBiddingSignals;
+  }
+
+  public static final class CustomAudience.Builder {
+    ctor public CustomAudience.Builder(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name, android.net.Uri dailyUpdateUri, android.net.Uri biddingLogicUri, java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience build();
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setActivationTime(java.time.Instant activationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setAds(java.util.List<androidx.privacysandbox.ads.adservices.common.AdData> ads);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBiddingLogicUri(android.net.Uri biddingLogicUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setBuyer(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setDailyUpdateUri(android.net.Uri dailyUpdateUri);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setExpirationTime(java.time.Instant expirationTime);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setName(String name);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setTrustedBiddingData(androidx.privacysandbox.ads.adservices.customaudience.TrustedBiddingData trustedBiddingSignals);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience.Builder setUserBiddingSignals(androidx.privacysandbox.ads.adservices.common.AdSelectionSignals userBiddingSignals);
+  }
+
+  public abstract class CustomAudienceManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? joinCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.JoinCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) public abstract suspend Object? leaveCustomAudience(androidx.privacysandbox.ads.adservices.customaudience.LeaveCustomAudienceRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager.Companion Companion;
+  }
+
+  public static final class CustomAudienceManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudienceManager? obtain(android.content.Context context);
+  }
+
+  public final class JoinCustomAudienceRequest {
+    ctor public JoinCustomAudienceRequest(androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience);
+    method public androidx.privacysandbox.ads.adservices.customaudience.CustomAudience getCustomAudience();
+    property public final androidx.privacysandbox.ads.adservices.customaudience.CustomAudience customAudience;
+  }
+
+  public final class LeaveCustomAudienceRequest {
+    ctor public LeaveCustomAudienceRequest(androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer, String name);
+    method public androidx.privacysandbox.ads.adservices.common.AdTechIdentifier getBuyer();
+    method public String getName();
+    property public final androidx.privacysandbox.ads.adservices.common.AdTechIdentifier buyer;
+    property public final String name;
+  }
+
+  public final class TrustedBiddingData {
+    ctor public TrustedBiddingData(android.net.Uri trustedBiddingUri, java.util.List<java.lang.String> trustedBiddingKeys);
+    method public java.util.List<java.lang.String> getTrustedBiddingKeys();
+    method public android.net.Uri getTrustedBiddingUri();
+    property public final java.util.List<java.lang.String> trustedBiddingKeys;
+    property public final android.net.Uri trustedBiddingUri;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.measurement {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class DeletionRequest {
+    ctor public DeletionRequest(int deletionMode, int matchBehavior, optional java.time.Instant start, optional java.time.Instant end, optional java.util.List<? extends android.net.Uri> domainUris, optional java.util.List<? extends android.net.Uri> originUris);
+    method public int getDeletionMode();
+    method public java.util.List<android.net.Uri> getDomainUris();
+    method public java.time.Instant getEnd();
+    method public int getMatchBehavior();
+    method public java.util.List<android.net.Uri> getOriginUris();
+    method public java.time.Instant getStart();
+    property public final int deletionMode;
+    property public final java.util.List<android.net.Uri> domainUris;
+    property public final java.time.Instant end;
+    property public final int matchBehavior;
+    property public final java.util.List<android.net.Uri> originUris;
+    property public final java.time.Instant start;
+    field public static final androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Companion Companion;
+    field public static final int DELETION_MODE_ALL = 0; // 0x0
+    field public static final int DELETION_MODE_EXCLUDE_INTERNAL_DATA = 1; // 0x1
+    field public static final int MATCH_BEHAVIOR_DELETE = 0; // 0x0
+    field public static final int MATCH_BEHAVIOR_PRESERVE = 1; // 0x1
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class DeletionRequest.Builder {
+    ctor public DeletionRequest.Builder(int deletionMode, int matchBehavior);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setDomainUris(java.util.List<? extends android.net.Uri> domainUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setEnd(java.time.Instant end);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setOriginUris(java.util.List<? extends android.net.Uri> originUris);
+    method public androidx.privacysandbox.ads.adservices.measurement.DeletionRequest.Builder setStart(java.time.Instant start);
+  }
+
+  public static final class DeletionRequest.Companion {
+  }
+
+  public abstract class MeasurementManager {
+    ctor public MeasurementManager();
+    method public abstract suspend Object? deleteRegistrations(androidx.privacysandbox.ads.adservices.measurement.DeletionRequest deletionRequest, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? getMeasurementApiStatus(kotlin.coroutines.Continuation<? super java.lang.Integer>);
+    method public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerSource(android.net.Uri attributionSource, android.view.InputEvent? inputEvent, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerTrigger(android.net.Uri trigger, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebSource(androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) public abstract suspend Object? registerWebTrigger(androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest request, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    field public static final androidx.privacysandbox.ads.adservices.measurement.MeasurementManager.Companion Companion;
+    field public static final int MEASUREMENT_API_STATE_DISABLED = 0; // 0x0
+    field public static final int MEASUREMENT_API_STATE_ENABLED = 1; // 0x1
+  }
+
+  public static final class MeasurementManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.measurement.MeasurementManager? obtain(android.content.Context context);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceParams {
+    ctor public WebSourceParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebSourceRegistrationRequest {
+    ctor public WebSourceRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri, optional android.view.InputEvent? inputEvent, optional android.net.Uri? appDestination, optional android.net.Uri? webDestination, optional android.net.Uri? verifiedDestination);
+    method public android.net.Uri? getAppDestination();
+    method public android.view.InputEvent? getInputEvent();
+    method public android.net.Uri getTopOriginUri();
+    method public android.net.Uri? getVerifiedDestination();
+    method public android.net.Uri? getWebDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> getWebSourceParams();
+    property public final android.net.Uri? appDestination;
+    property public final android.view.InputEvent? inputEvent;
+    property public final android.net.Uri topOriginUri;
+    property public final android.net.Uri? verifiedDestination;
+    property public final android.net.Uri? webDestination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams;
+  }
+
+  public static final class WebSourceRegistrationRequest.Builder {
+    ctor public WebSourceRegistrationRequest.Builder(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebSourceParams> webSourceParams, android.net.Uri topOriginUri);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest build();
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setAppDestination(android.net.Uri? appDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setInputEvent(android.view.InputEvent inputEvent);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setVerifiedDestination(android.net.Uri? verifiedDestination);
+    method public androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest.Builder setWebDestination(android.net.Uri? webDestination);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerParams {
+    ctor public WebTriggerParams(android.net.Uri registrationUri, boolean debugKeyAllowed);
+    method public boolean getDebugKeyAllowed();
+    method public android.net.Uri getRegistrationUri();
+    property public final boolean debugKeyAllowed;
+    property public final android.net.Uri registrationUri;
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WebTriggerRegistrationRequest {
+    ctor public WebTriggerRegistrationRequest(java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams, android.net.Uri destination);
+    method public android.net.Uri getDestination();
+    method public java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> getWebTriggerParams();
+    property public final android.net.Uri destination;
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams> webTriggerParams;
+  }
+
+}
+
+package androidx.privacysandbox.ads.adservices.topics {
+
+  public final class GetTopicsRequest {
+    ctor public GetTopicsRequest(optional String adsSdkName, optional boolean shouldRecordObservation);
+    method public String getAdsSdkName();
+    method public boolean getShouldRecordObservation();
+    property public final String adsSdkName;
+    property public final boolean shouldRecordObservation;
+  }
+
+  public static final class GetTopicsRequest.Builder {
+    ctor public GetTopicsRequest.Builder();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest build();
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setAdsSdkName(String adsSdkName);
+    method public androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest.Builder setShouldRecordObservation(boolean shouldRecordObservation);
+  }
+
+  public final class GetTopicsResponse {
+    ctor public GetTopicsResponse(java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics);
+    method public java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> getTopics();
+    property public final java.util.List<androidx.privacysandbox.ads.adservices.topics.Topic> topics;
+  }
+
+  public final class Topic {
+    ctor public Topic(long taxonomyVersion, long modelVersion, int topicId);
+    method public long getModelVersion();
+    method public long getTaxonomyVersion();
+    method public int getTopicId();
+    property public final long modelVersion;
+    property public final long taxonomyVersion;
+    property public final int topicId;
+  }
+
+  public abstract class TopicsManager {
+    method @RequiresPermission(android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) public abstract suspend Object? getTopics(androidx.privacysandbox.ads.adservices.topics.GetTopicsRequest request, kotlin.coroutines.Continuation<? super androidx.privacysandbox.ads.adservices.topics.GetTopicsResponse>);
+    method public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+    field public static final androidx.privacysandbox.ads.adservices.topics.TopicsManager.Companion Companion;
+  }
+
+  public static final class TopicsManager.Companion {
+    method public androidx.privacysandbox.ads.adservices.topics.TopicsManager? obtain(android.content.Context context);
+  }
+
+}
+
diff --git a/privacysandbox/ads/ads-adservices/build.gradle b/privacysandbox/ads/ads-adservices/build.gradle
index 2679d8e..1c3ab60 100644
--- a/privacysandbox/ads/ads-adservices/build.gradle
+++ b/privacysandbox/ads/ads-adservices/build.gradle
@@ -28,7 +28,7 @@
     api(libs.kotlinStdlib)
     api(libs.kotlinCoroutinesCore)
     implementation("androidx.core:core-ktx:1.8.0")
-    api(projectOrArtifact(":annotation:annotation"))
+    api("androidx.annotation:annotation:1.6.0")
 
     androidTestImplementation(libs.junit)
     androidTestImplementation(libs.kotlinTestJunit)
diff --git a/privacysandbox/tools/tools-apicompiler/build.gradle b/privacysandbox/tools/tools-apicompiler/build.gradle
index 22995d8..4609de5 100644
--- a/privacysandbox/tools/tools-apicompiler/build.gradle
+++ b/privacysandbox/tools/tools-apicompiler/build.gradle
@@ -23,6 +23,8 @@
     id("kotlin")
 }
 
+androidx.configureAarAsJarForConfiguration("testImplementation")
+
 dependencies {
     api(libs.kotlinStdlib)
     implementation(libs.kspApi)
@@ -32,6 +34,7 @@
 
     testImplementation(project(":privacysandbox:tools:tools-testing"))
     testImplementation(project(":room:room-compiler-processing-testing"))
+    testImplementationAarAsJar(project(":privacysandbox:ui:ui-core"))
     testImplementation(libs.junit)
     testImplementation(libs.truth)
     testImplementation(libs.kotlinCoroutinesCore)
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/build.gradle b/privacysandbox/tools/tools-apigenerator/build.gradle
index 5e82a89..029cc35 100644
--- a/privacysandbox/tools/tools-apigenerator/build.gradle
+++ b/privacysandbox/tools/tools-apigenerator/build.gradle
@@ -24,6 +24,8 @@
     id("kotlin")
 }
 
+androidx.configureAarAsJarForConfiguration("testImplementation")
+
 dependencies {
     api(libs.kotlinStdlib)
     implementation(libs.asm)
@@ -37,6 +39,8 @@
     testImplementation(project(":privacysandbox:tools:tools-apipackager"))
     testImplementation(project(":privacysandbox:tools:tools-testing"))
     testImplementation(project(":room:room-compiler-processing-testing"))
+    testImplementationAarAsJar(project(":privacysandbox:ui:ui-core"))
+    testImplementationAarAsJar(project(":privacysandbox:ui:ui-client"))
     testImplementation(libs.kotlinCoroutinesCore)
     testImplementation(libs.junit)
     testImplementation(libs.truth)
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..df137b48 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..6082ce2 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
@@ -61,56 +61,4 @@
     ),
 )
 
-val syntheticUiLibraryStubs = listOf(
-    Source.kotlin(
-        "androidx/privacysandbox/ui/core/SandboxedUiAdapter.kt", """
-        |package androidx.privacysandbox.ui.core
-        |
-        |import android.content.Context
-        |import android.view.View
-        |import java.util.concurrent.Executor
-        |
-        |interface SandboxedUiAdapter {
-        |  fun openSession(
-        |      context: Context,
-        |      initialWidth: Int,
-        |      initialHeight: Int,
-        |      isZOrderOnTop: Boolean,
-        |      clientExecutor: Executor,
-        |      client: SessionClient
-        |  )
-        |
-        |
-        |  interface Session {
-        |    fun close()
-        |    val view: View
-        |  }
-        |
-        |  interface SessionClient {
-        |    fun onSessionError(throwable: Throwable);
-        |    fun onSessionOpened(session: Session);
-        |  }
-        |}
-        |""".trimMargin()
-    ),
-    Source.kotlin(
-        "androidx/privacysandbox/ui/core/SdkRuntimeUiLibVersions.kt", """
-        |package androidx.privacysandbox.ui.core
-        |
-        |import androidx.annotation.RestrictTo
-        |
-        |object SdkRuntimeUiLibVersions {
-        |    var clientVersion: Int = -1
-        |        /**
-        |         * @hide
-        |         */
-        |        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        |        set
-        |
-        |    const val apiVersion: Int = 1
-        |}
-        |""".trimMargin()
-    ),
-)
-
-val allTestLibraryStubs = syntheticSdkRuntimeLibraryStubs + syntheticUiLibraryStubs
\ No newline at end of file
+val allTestLibraryStubs = syntheticSdkRuntimeLibraryStubs
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/api/1.3.0-beta02.txt b/profileinstaller/profileinstaller/api/1.3.0-beta02.txt
new file mode 100644
index 0000000..e7da088
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/1.3.0-beta02.txt
@@ -0,0 +1,74 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_BENCHMARK_OPERATION = "androidx.profileinstaller.action.BENCHMARK_OPERATION";
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+    field public static final String ACTION_SAVE_PROFILE = "androidx.profileinstaller.action.SAVE_PROFILE";
+    field public static final String ACTION_SKIP_FILE = "androidx.profileinstaller.action.SKIP_FILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_PROFILE_IS_COMPRESSED = 5; // 0x5
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_BENCHMARK_OPERATION_FAILURE = 15; // 0xf
+    field public static final int RESULT_BENCHMARK_OPERATION_SUCCESS = 14; // 0xe
+    field public static final int RESULT_BENCHMARK_OPERATION_UNKNOWN = 16; // 0x10
+    field public static final int RESULT_DELETE_SKIP_FILE_SUCCESS = 11; // 0xb
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SKIP_FILE_SUCCESS = 10; // 0xa
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_SAVE_PROFILE_SIGNALLED = 12; // 0xc
+    field public static final int RESULT_SAVE_PROFILE_SKIPPED = 13; // 0xd
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+  public final class ProfileVerifier {
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.profileinstaller.ProfileVerifier.CompilationStatus!> getCompilationStatusAsync();
+    method @WorkerThread public static androidx.profileinstaller.ProfileVerifier.CompilationStatus writeProfileVerification(android.content.Context);
+  }
+
+  public static class ProfileVerifier.CompilationStatus {
+    method public int getProfileInstallResultCode();
+    method public boolean hasProfileEnqueuedForCompilation();
+    method public boolean isCompiledWithProfile();
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE = 1; // 0x1
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING = 3; // 0x3
+    field public static final int RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ = 131072; // 0x20000
+    field public static final int RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE = 196608; // 0x30000
+    field public static final int RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST = 65536; // 0x10000
+    field public static final int RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION = 262144; // 0x40000
+    field public static final int RESULT_CODE_NO_PROFILE = 0; // 0x0
+    field public static final int RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION = 2; // 0x2
+  }
+
+}
+
diff --git a/profileinstaller/profileinstaller/api/public_plus_experimental_1.3.0-beta02.txt b/profileinstaller/profileinstaller/api/public_plus_experimental_1.3.0-beta02.txt
new file mode 100644
index 0000000..e7da088
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/public_plus_experimental_1.3.0-beta02.txt
@@ -0,0 +1,74 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_BENCHMARK_OPERATION = "androidx.profileinstaller.action.BENCHMARK_OPERATION";
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+    field public static final String ACTION_SAVE_PROFILE = "androidx.profileinstaller.action.SAVE_PROFILE";
+    field public static final String ACTION_SKIP_FILE = "androidx.profileinstaller.action.SKIP_FILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_PROFILE_IS_COMPRESSED = 5; // 0x5
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_BENCHMARK_OPERATION_FAILURE = 15; // 0xf
+    field public static final int RESULT_BENCHMARK_OPERATION_SUCCESS = 14; // 0xe
+    field public static final int RESULT_BENCHMARK_OPERATION_UNKNOWN = 16; // 0x10
+    field public static final int RESULT_DELETE_SKIP_FILE_SUCCESS = 11; // 0xb
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SKIP_FILE_SUCCESS = 10; // 0xa
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_SAVE_PROFILE_SIGNALLED = 12; // 0xc
+    field public static final int RESULT_SAVE_PROFILE_SKIPPED = 13; // 0xd
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+  public final class ProfileVerifier {
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.profileinstaller.ProfileVerifier.CompilationStatus!> getCompilationStatusAsync();
+    method @WorkerThread public static androidx.profileinstaller.ProfileVerifier.CompilationStatus writeProfileVerification(android.content.Context);
+  }
+
+  public static class ProfileVerifier.CompilationStatus {
+    method public int getProfileInstallResultCode();
+    method public boolean hasProfileEnqueuedForCompilation();
+    method public boolean isCompiledWithProfile();
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE = 1; // 0x1
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING = 3; // 0x3
+    field public static final int RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ = 131072; // 0x20000
+    field public static final int RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE = 196608; // 0x30000
+    field public static final int RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST = 65536; // 0x10000
+    field public static final int RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION = 262144; // 0x40000
+    field public static final int RESULT_CODE_NO_PROFILE = 0; // 0x0
+    field public static final int RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION = 2; // 0x2
+  }
+
+}
+
diff --git a/profileinstaller/profileinstaller/api/res-1.3.0-beta02.txt b/profileinstaller/profileinstaller/api/res-1.3.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/res-1.3.0-beta02.txt
diff --git a/profileinstaller/profileinstaller/api/restricted_1.3.0-beta02.txt b/profileinstaller/profileinstaller/api/restricted_1.3.0-beta02.txt
new file mode 100644
index 0000000..e7da088
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/restricted_1.3.0-beta02.txt
@@ -0,0 +1,74 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_BENCHMARK_OPERATION = "androidx.profileinstaller.action.BENCHMARK_OPERATION";
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+    field public static final String ACTION_SAVE_PROFILE = "androidx.profileinstaller.action.SAVE_PROFILE";
+    field public static final String ACTION_SKIP_FILE = "androidx.profileinstaller.action.SKIP_FILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_PROFILE_IS_COMPRESSED = 5; // 0x5
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_BENCHMARK_OPERATION_FAILURE = 15; // 0xf
+    field public static final int RESULT_BENCHMARK_OPERATION_SUCCESS = 14; // 0xe
+    field public static final int RESULT_BENCHMARK_OPERATION_UNKNOWN = 16; // 0x10
+    field public static final int RESULT_DELETE_SKIP_FILE_SUCCESS = 11; // 0xb
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SKIP_FILE_SUCCESS = 10; // 0xa
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_SAVE_PROFILE_SIGNALLED = 12; // 0xc
+    field public static final int RESULT_SAVE_PROFILE_SKIPPED = 13; // 0xd
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+  public final class ProfileVerifier {
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.profileinstaller.ProfileVerifier.CompilationStatus!> getCompilationStatusAsync();
+    method @WorkerThread public static androidx.profileinstaller.ProfileVerifier.CompilationStatus writeProfileVerification(android.content.Context);
+  }
+
+  public static class ProfileVerifier.CompilationStatus {
+    method public int getProfileInstallResultCode();
+    method public boolean hasProfileEnqueuedForCompilation();
+    method public boolean isCompiledWithProfile();
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE = 1; // 0x1
+    field public static final int RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING = 3; // 0x3
+    field public static final int RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ = 131072; // 0x20000
+    field public static final int RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE = 196608; // 0x30000
+    field public static final int RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST = 65536; // 0x10000
+    field public static final int RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION = 262144; // 0x40000
+    field public static final int RESULT_CODE_NO_PROFILE = 0; // 0x0
+    field public static final int RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION = 2; // 0x2
+  }
+
+}
+
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/recyclerview/recyclerview/api/current.txt b/recyclerview/recyclerview/api/current.txt
index 3750c3c..ca945e9 100644
--- a/recyclerview/recyclerview/api/current.txt
+++ b/recyclerview/recyclerview/api/current.txt
@@ -470,6 +470,7 @@
     method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
     method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+    method public static void setDebugAssertionsEnabled(boolean);
     method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
     method public void setHasFixedSize(boolean);
     method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
@@ -483,6 +484,7 @@
     method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
     method @Deprecated public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
     method public void setScrollingTouchSlop(int);
+    method public static void setVerboseLoggingEnabled(boolean);
     method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
     method public void smoothScrollBy(@Px int, @Px int);
     method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
diff --git a/recyclerview/recyclerview/api/public_plus_experimental_current.txt b/recyclerview/recyclerview/api/public_plus_experimental_current.txt
index 3750c3c..ca945e9 100644
--- a/recyclerview/recyclerview/api/public_plus_experimental_current.txt
+++ b/recyclerview/recyclerview/api/public_plus_experimental_current.txt
@@ -470,6 +470,7 @@
     method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
     method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+    method public static void setDebugAssertionsEnabled(boolean);
     method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
     method public void setHasFixedSize(boolean);
     method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
@@ -483,6 +484,7 @@
     method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
     method @Deprecated public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
     method public void setScrollingTouchSlop(int);
+    method public static void setVerboseLoggingEnabled(boolean);
     method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
     method public void smoothScrollBy(@Px int, @Px int);
     method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
diff --git a/recyclerview/recyclerview/api/restricted_current.txt b/recyclerview/recyclerview/api/restricted_current.txt
index 31a4f238..2b2bdad 100644
--- a/recyclerview/recyclerview/api/restricted_current.txt
+++ b/recyclerview/recyclerview/api/restricted_current.txt
@@ -470,6 +470,7 @@
     method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
     method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
     method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+    method public static void setDebugAssertionsEnabled(boolean);
     method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
     method public void setHasFixedSize(boolean);
     method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
@@ -483,6 +484,7 @@
     method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
     method @Deprecated public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
     method public void setScrollingTouchSlop(int);
+    method public static void setVerboseLoggingEnabled(boolean);
     method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
     method public void smoothScrollBy(@Px int, @Px int);
     method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
diff --git a/recyclerview/recyclerview/build.gradle b/recyclerview/recyclerview/build.gradle
index 758e3f6..caa887e 100644
--- a/recyclerview/recyclerview/build.gradle
+++ b/recyclerview/recyclerview/build.gradle
@@ -12,6 +12,7 @@
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.customview:customview:1.0.0")
     implementation("androidx.customview:customview-poolingcontainer:1.0.0")
+    implementation("androidx.profileinstaller:profileinstaller:1.2.1")
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GapWorker.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GapWorker.java
index b2d9f2e..5bbdcf1 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GapWorker.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GapWorker.java
@@ -157,7 +157,7 @@
     }
 
     public void add(RecyclerView recyclerView) {
-        if (RecyclerView.DEBUG && mRecyclerViews.contains(recyclerView)) {
+        if (RecyclerView.sDebugAssertionsEnabled && mRecyclerViews.contains(recyclerView)) {
             throw new IllegalStateException("RecyclerView already present in worker list!");
         }
         mRecyclerViews.add(recyclerView);
@@ -165,7 +165,7 @@
 
     public void remove(RecyclerView recyclerView) {
         boolean removeSuccess = mRecyclerViews.remove(recyclerView);
-        if (RecyclerView.DEBUG && !removeSuccess) {
+        if (RecyclerView.sDebugAssertionsEnabled && !removeSuccess) {
             throw new IllegalStateException("RecyclerView removal failed!");
         }
     }
@@ -175,7 +175,7 @@
      */
     void postFromTraversal(RecyclerView recyclerView, int prefetchDx, int prefetchDy) {
         if (recyclerView.isAttachedToWindow()) {
-            if (RecyclerView.DEBUG && !mRecyclerViews.contains(recyclerView)) {
+            if (RecyclerView.sDebugAssertionsEnabled && !mRecyclerViews.contains(recyclerView)) {
                 throw new IllegalStateException("attempting to post unregistered view!");
             }
             if (mPostTimeNs == 0) {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 149cc67..22e7245 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -219,7 +219,8 @@
 
     static final String TAG = "RecyclerView";
 
-    static final boolean DEBUG = false;
+    static boolean sDebugAssertionsEnabled = false;
+    static boolean sVerboseLoggingEnabled = false;
 
     static final boolean VERBOSE_TRACING = false;
 
@@ -386,6 +387,35 @@
     private static final Class<?>[] LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE =
             new Class<?>[]{Context.class, AttributeSet.class, int.class, int.class};
 
+    /**
+     * Enable internal assertions about RecyclerView's state and throw exceptions if the
+     * assertions are violated.
+     * <p>
+     * This is primarily intended to diagnose problems with RecyclerView, and
+     * <strong>should not be enabled in production</strong> unless you have a specific reason to
+     * do so.
+     * <p>
+     * Enabling this may negatively affect performance and/or stability.
+     *
+     * @param debugAssertionsEnabled true to enable assertions; false to disable them
+     */
+    public static void setDebugAssertionsEnabled(boolean debugAssertionsEnabled) {
+        RecyclerView.sDebugAssertionsEnabled = debugAssertionsEnabled;
+    }
+
+    /**
+     * Enable verbose logging within RecyclerView itself.
+     * <p>
+     * Enabling this may negatively affect performance and reduce the utility of logcat due to
+     * high-volume logging.  This generally <strong>should not be enabled in production</strong>
+     * unless you have a specific reason for doing so.
+     *
+     * @param verboseLoggingEnabled true to enable logging; false to disable it
+     */
+    public static void setVerboseLoggingEnabled(boolean verboseLoggingEnabled) {
+        RecyclerView.sVerboseLoggingEnabled = verboseLoggingEnabled;
+    }
+
     private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver();
 
     final Recycler mRecycler = new Recycler();
@@ -983,7 +1013,7 @@
                         throw new IllegalArgumentException("Called attach on a child which is not"
                                 + " detached: " + vh + exceptionLabel());
                     }
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "reAttach " + vh);
                     }
                     vh.clearTmpDetachFlag();
@@ -1001,7 +1031,7 @@
                             throw new IllegalArgumentException("called detach on an already"
                                     + " detached child " + vh + exceptionLabel());
                         }
-                        if (DEBUG) {
+                        if (sVerboseLoggingEnabled) {
                             Log.d(TAG, "tmpDetach " + vh);
                         }
                         vh.addFlags(ViewHolder.FLAG_TMP_DETACHED);
@@ -1039,7 +1069,7 @@
                 // ensure it is not hidden because for adapter helper, the only thing matter is that
                 // LM thinks view is a child.
                 if (mChildHelper.isHidden(vh.itemView)) {
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "assuming view holder cannot be find because it is hidden");
                     }
                     return null;
@@ -1554,7 +1584,7 @@
             final ViewHolder viewHolder = getChildViewHolderInt(view);
             mRecycler.unscrapView(viewHolder);
             mRecycler.recycleViewHolderInternal(viewHolder);
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.d(TAG, "after removing animated view: " + view + ", " + this);
             }
         }
@@ -1638,7 +1668,7 @@
         if (state == mScrollState) {
             return;
         }
-        if (DEBUG) {
+        if (sVerboseLoggingEnabled) {
             Log.d(TAG, "setting scroll state to " + state + " from " + mScrollState,
                     new Exception());
         }
@@ -2407,7 +2437,7 @@
     void stopInterceptRequestLayout(boolean performLayoutChildren) {
         if (mInterceptRequestLayoutDepth < 1) {
             //noinspection PointlessBooleanExpression
-            if (DEBUG) {
+            if (sDebugAssertionsEnabled) {
                 throw new IllegalStateException("stopInterceptRequestLayout was called more "
                         + "times than startInterceptRequestLayout."
                         + exceptionLabel());
@@ -4105,7 +4135,7 @@
     void onExitLayoutOrScroll(boolean enableChangeEvents) {
         mLayoutOrScrollCounter--;
         if (mLayoutOrScrollCounter < 1) {
-            if (DEBUG && mLayoutOrScrollCounter < 0) {
+            if (sDebugAssertionsEnabled && mLayoutOrScrollCounter < 0) {
                 throw new IllegalStateException("layout or scroll counter cannot go below zero."
                         + "Some calls are not matching" + exceptionLabel());
             }
@@ -5015,7 +5045,7 @@
         final int childCount = mChildHelper.getUnfilteredChildCount();
         for (int i = 0; i < childCount; i++) {
             final ViewHolder holder = getChildViewHolderInt(mChildHelper.getUnfilteredChildAt(i));
-            if (DEBUG && holder.mPosition == -1 && !holder.isRemoved()) {
+            if (sDebugAssertionsEnabled && holder.mPosition == -1 && !holder.isRemoved()) {
                 throw new IllegalStateException("view holder cannot have position -1 unless it"
                         + " is removed" + exceptionLabel());
             }
@@ -5054,7 +5084,7 @@
             if (holder == null || holder.mPosition < start || holder.mPosition > end) {
                 continue;
             }
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.d(TAG, "offsetPositionRecordsForMove attached child " + i + " holder "
                         + holder);
             }
@@ -5075,7 +5105,7 @@
         for (int i = 0; i < childCount; i++) {
             final ViewHolder holder = getChildViewHolderInt(mChildHelper.getUnfilteredChildAt(i));
             if (holder != null && !holder.shouldIgnore() && holder.mPosition >= positionStart) {
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "offsetPositionRecordsForInsert attached child " + i + " holder "
                             + holder + " now at position " + (holder.mPosition + itemCount));
                 }
@@ -5095,7 +5125,7 @@
             final ViewHolder holder = getChildViewHolderInt(mChildHelper.getUnfilteredChildAt(i));
             if (holder != null && !holder.shouldIgnore()) {
                 if (holder.mPosition >= positionEnd) {
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "offsetPositionRecordsForRemove attached child " + i
                                 + " holder " + holder + " now at position "
                                 + (holder.mPosition - itemCount));
@@ -5103,7 +5133,7 @@
                     holder.offsetPosition(-itemCount, applyToPreLayout);
                     mState.mStructureChanged = true;
                 } else if (holder.mPosition >= positionStart) {
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "offsetPositionRecordsForRemove attached child " + i
                                 + " holder " + holder + " now REMOVED");
                     }
@@ -6284,7 +6314,7 @@
                 PoolingContainer.callPoolingContainerOnRelease(scrap.itemView);
                 return;
             }
-            if (DEBUG && scrapHeap.contains(scrap)) {
+            if (sDebugAssertionsEnabled && scrapHeap.contains(scrap)) {
                 throw new IllegalArgumentException("this scrap item already exists");
             }
             scrap.resetInternal();
@@ -6539,7 +6569,7 @@
             // if it is a removed holder, nothing to verify since we cannot ask adapter anymore
             // if it is not removed, verify the type and id.
             if (holder.isRemoved()) {
-                if (DEBUG && !mState.isPreLayout()) {
+                if (sDebugAssertionsEnabled && !mState.isPreLayout()) {
                     throw new IllegalStateException("should not receive a removed view unless it"
                             + " is pre layout" + exceptionLabel());
                 }
@@ -6788,7 +6818,7 @@
                     }
                 }
                 if (holder == null) { // fallback to pool
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "tryGetViewHolderForPositionByDeadline("
                                 + position + ") fetching from shared pool");
                     }
@@ -6818,7 +6848,7 @@
 
                     long end = getNanoTime();
                     mRecyclerPool.factorInCreateTime(type, end - start);
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "tryGetViewHolderForPositionByDeadline created new ViewHolder");
                     }
                 }
@@ -6845,7 +6875,7 @@
                 // do not update unless we absolutely have to.
                 holder.mPreLayoutPosition = position;
             } else if (!holder.isBound() || holder.needsUpdate() || holder.isInvalid()) {
-                if (DEBUG && holder.isRemoved()) {
+                if (sDebugAssertionsEnabled && holder.isRemoved()) {
                     throw new IllegalStateException("Removed holder should be bound and it should"
                             + " come here only in pre-layout. Holder: " + holder
                             + exceptionLabel());
@@ -6984,11 +7014,11 @@
          * @param cachedViewIndex The index of the view in cached views list
          */
         void recycleCachedViewAt(int cachedViewIndex) {
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.d(TAG, "Recycling cached view at index " + cachedViewIndex);
             }
             ViewHolder viewHolder = mCachedViews.get(cachedViewIndex);
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.d(TAG, "CachedViewHolder to be recycled: " + viewHolder);
             }
             addViewHolderToRecycledViewPool(viewHolder, true);
@@ -7026,7 +7056,7 @@
                     && mAdapter.onFailedToRecycleView(holder);
             boolean cached = false;
             boolean recycled = false;
-            if (DEBUG && mCachedViews.contains(holder)) {
+            if (sDebugAssertionsEnabled && mCachedViews.contains(holder)) {
                 throw new IllegalArgumentException("cached view received recycle internal? "
                         + holder + exceptionLabel());
             }
@@ -7072,7 +7102,7 @@
 
                 // TODO: consider cancelling an animation when an item is removed scrollBy,
                 // to return it to the pool faster
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "trying to recycle a non-recycleable holder. Hopefully, it will "
                             + "re-visit here. We are still removing it from animation lists"
                             + exceptionLabel());
@@ -7274,7 +7304,7 @@
                     if (!dryRun) {
                         mCachedViews.remove(i);
                     }
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "getScrapOrHiddenOrCachedHolderForPosition(" + position
                                 + ") found match in cache: " + holder);
                     }
@@ -7354,7 +7384,7 @@
             if (mState != null) {
                 mViewInfoStore.removeViewHolder(holder);
             }
-            if (DEBUG) Log.d(TAG, "dispatchViewRecycled: " + holder);
+            if (sVerboseLoggingEnabled) Log.d(TAG, "dispatchViewRecycled: " + holder);
         }
 
         void onAdapterChanged(Adapter<?> oldAdapter, Adapter<?> newAdapter,
@@ -7388,7 +7418,7 @@
                 } else {
                     holder.offsetPosition(inBetweenOffset, false);
                 }
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "offsetPositionRecordsForMove cached child " + i + " holder "
                             + holder);
                 }
@@ -7400,7 +7430,7 @@
             for (int i = 0; i < cachedCount; i++) {
                 final ViewHolder holder = mCachedViews.get(i);
                 if (holder != null && holder.mPosition >= insertedAt) {
-                    if (DEBUG) {
+                    if (sVerboseLoggingEnabled) {
                         Log.d(TAG, "offsetPositionRecordsForInsert cached " + i + " holder "
                                 + holder + " now at position " + (holder.mPosition + count));
                     }
@@ -7423,7 +7453,7 @@
                 final ViewHolder holder = mCachedViews.get(i);
                 if (holder != null) {
                     if (holder.mPosition >= removedEnd) {
-                        if (DEBUG) {
+                        if (sVerboseLoggingEnabled) {
                             Log.d(TAG, "offsetPositionRecordsForRemove cached " + i
                                     + " holder " + holder + " now at position "
                                     + (holder.mPosition - count));
@@ -9173,7 +9203,7 @@
          * @param position Scroll to this adapter position.
          */
         public void scrollToPosition(int position) {
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.e(TAG, "You MUST implement scrollToPosition. It will soon become abstract");
             }
         }
@@ -9354,7 +9384,7 @@
                 }
             }
             if (lp.mPendingInvalidate) {
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "consuming pending invalidate on child " + lp.mViewHolder);
                 }
                 holder.itemView.invalidate();
@@ -9946,7 +9976,7 @@
         private void scrapOrRecycleView(Recycler recycler, int index, View view) {
             final ViewHolder viewHolder = getChildViewHolderInt(view);
             if (viewHolder.shouldIgnore()) {
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "ignoring view " + viewHolder);
                 }
                 return;
@@ -12246,7 +12276,7 @@
             mIsRecyclableCount = recyclable ? mIsRecyclableCount - 1 : mIsRecyclableCount + 1;
             if (mIsRecyclableCount < 0) {
                 mIsRecyclableCount = 0;
-                if (DEBUG) {
+                if (sDebugAssertionsEnabled) {
                     throw new RuntimeException("isRecyclable decremented below 0: "
                             + "unmatched pair of setIsRecyable() calls for " + this);
                 }
@@ -12257,7 +12287,7 @@
             } else if (recyclable && mIsRecyclableCount == 0) {
                 mFlags &= ~FLAG_NOT_RECYCLABLE;
             }
-            if (DEBUG) {
+            if (sVerboseLoggingEnabled) {
                 Log.d(TAG, "setIsRecyclable val:" + recyclable + ":" + this);
             }
         }
@@ -12852,7 +12882,7 @@
         protected void onChildAttachedToWindow(View child) {
             if (getChildPosition(child) == getTargetPosition()) {
                 mTargetView = child;
-                if (DEBUG) {
+                if (sVerboseLoggingEnabled) {
                     Log.d(TAG, "smooth scroll target view has been attached");
                 }
             }
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/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InvalidationTrackerFlowTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InvalidationTrackerFlowTest.kt
index 3ee01a5..1b5d195 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InvalidationTrackerFlowTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/InvalidationTrackerFlowTest.kt
@@ -39,6 +39,7 @@
 import kotlinx.coroutines.yield
 import org.junit.After
 import org.junit.Assert.fail
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -105,6 +106,7 @@
         channel.cancel()
     }
 
+    @Ignore // b/268534919
     @Test
     fun emitOnceForMultipleTablesInTransaction(): Unit = runBlocking {
         val results = mutableListOf<Set<String>>()
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/main/java/androidx/room/compiler/processing/XType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
index b1a65c0..9ad98bf 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
@@ -29,7 +29,7 @@
  * @see javax.lang.model.type.TypeMirror
  * @see [XArrayType]
  */
-interface XType {
+interface XType : XAnnotated {
     /**
      * The Javapoet [TypeName] representation of the type
      */
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotation.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotation.kt
new file mode 100644
index 0000000..ac2d325
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotation.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.room.compiler.processing.javac
+
+import androidx.room.compiler.processing.InternalXAnnotation
+import androidx.room.compiler.processing.XAnnotationBox
+import androidx.room.compiler.processing.XAnnotationValue
+import androidx.room.compiler.processing.XType
+import androidx.room.compiler.processing.javac.kotlin.KmAnnotationContainer
+
+internal class JavacKmAnnotation(
+    private val env: JavacProcessingEnv,
+    private val kmAnnotation: KmAnnotationContainer
+) : InternalXAnnotation() {
+    override fun <T : Annotation> asAnnotationBox(annotationClass: Class<T>): XAnnotationBox<T> {
+        throw UnsupportedOperationException("No plan to support XAnnotationBox.")
+    }
+
+    override val name: String
+        get() = typeElement.name
+
+    override val qualifiedName: String
+        get() = typeElement.qualifiedName
+
+    override val typeElement: JavacTypeElement by lazy {
+        requireNotNull(env.findTypeElement(kmAnnotation.className))
+    }
+
+    override val type: XType
+        get() = typeElement.type
+
+    override val annotationValues: List<XAnnotationValue> by lazy {
+        val methods = typeElement.getDeclaredMethods()
+        methods.map { method ->
+            JavacKmAnnotationValue(
+                method = method,
+                kmAnnotationArgumentContainer =
+                    kmAnnotation.getArguments(env).getValue(method.jvmName)
+            )
+        }
+    }
+}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotationValue.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotationValue.kt
new file mode 100644
index 0000000..c100d0b
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacKmAnnotationValue.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.room.compiler.processing.javac
+
+import androidx.room.compiler.processing.InternalXAnnotationValue
+import androidx.room.compiler.processing.XMethodElement
+import androidx.room.compiler.processing.XType
+import androidx.room.compiler.processing.javac.kotlin.KmAnnotationArgumentContainer
+
+internal class JavacKmAnnotationValue(
+    private val method: XMethodElement,
+    override val valueType: XType = method.returnType,
+    private val kmAnnotationArgumentContainer: KmAnnotationArgumentContainer
+) : InternalXAnnotationValue() {
+    override val name: String = method.jvmName
+    override val value: Any? by lazy {
+        kmAnnotationArgumentContainer.getValue(method)
+    }
+}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
index 3dd55ea..89420be 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
@@ -17,6 +17,9 @@
 package androidx.room.compiler.processing.javac
 
 import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.processing.InternalXAnnotated
+import androidx.room.compiler.processing.XAnnotation
+import androidx.room.compiler.processing.XAnnotationBox
 import androidx.room.compiler.processing.XEquality
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XRawType
@@ -25,6 +28,8 @@
 import androidx.room.compiler.processing.javac.kotlin.KmTypeContainer
 import androidx.room.compiler.processing.ksp.ERROR_JTYPE_NAME
 import androidx.room.compiler.processing.safeTypeName
+import androidx.room.compiler.processing.unwrapRepeatedAnnotationsFromContainer
+import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreTypes
 import javax.lang.model.type.TypeKind
 import javax.lang.model.type.TypeMirror
@@ -34,7 +39,8 @@
     internal val env: JavacProcessingEnv,
     open val typeMirror: TypeMirror,
     internal val maybeNullability: XNullability?,
-) : XType, XEquality {
+) : XType, XEquality, InternalXAnnotated {
+
     // Kotlin type information about the type if this type is driven from Kotlin code.
     abstract val kotlinType: KmTypeContainer?
 
@@ -85,6 +91,37 @@
 
     override fun asTypeName() = xTypeName
 
+    override fun <T : Annotation> getAnnotations(
+        annotation: KClass<T>,
+        containerAnnotation: KClass<out Annotation>?
+    ): List<XAnnotationBox<T>> {
+        throw UnsupportedOperationException("No plan to support XAnnotationBox.")
+    }
+
+    override fun hasAnnotation(
+        annotation: KClass<out Annotation>,
+        containerAnnotation: KClass<out Annotation>?
+    ): Boolean {
+        val annotationClassName: String = annotation.java.canonicalName!!
+        return getAllAnnotations().any { it.qualifiedName == annotationClassName }
+    }
+
+    override fun getAllAnnotations(): List<XAnnotation> {
+        return kotlinType?.annotations?.map {
+            JavacKmAnnotation(env, it)
+        } ?: typeMirror.annotationMirrors.map { mirror -> JavacAnnotation(env, mirror) }
+                .flatMap { annotation ->
+                    annotation.unwrapRepeatedAnnotationsFromContainer() ?: listOf(annotation)
+                }
+    }
+
+    override fun hasAnnotationWithPackage(pkg: String): Boolean {
+        return getAllAnnotations().any {
+            val element = (it.typeElement as JavacTypeElement).element
+            MoreElements.getPackage(element).toString() == pkg
+        }
+    }
+
     override fun equals(other: Any?): Boolean {
         return XEquality.equals(this, other)
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
index 5b09016..1029947 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
@@ -37,6 +37,7 @@
 import com.squareup.kotlinpoet.javapoet.JClassName
 import javax.lang.model.element.ElementKind
 import javax.lang.model.element.TypeElement
+import javax.lang.model.type.DeclaredType
 import javax.lang.model.type.TypeKind
 import javax.lang.model.util.ElementFilter
 
@@ -218,11 +219,15 @@
     }
 
     override val superInterfaces by lazy {
+        val superTypesFromKotlinMetadata = kotlinMetadata?.superTypes
+            ?.associateBy { it.className } ?: emptyMap()
         element.interfaces.map {
+            check(it is DeclaredType)
+            val interfaceName = ClassName.get(MoreElements.asType(it.asElement()))
             val element = MoreTypes.asTypeElement(it)
             env.wrap<JavacType>(
                 typeMirror = it,
-                kotlinType = KmClassContainer.createFor(env, element)?.type,
+                kotlinType = superTypesFromKotlinMetadata[interfaceName.canonicalName()],
                 elementNullability = element.nullability
             )
         }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
index fdf221a..9e8131c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
@@ -16,7 +16,12 @@
 
 package androidx.room.compiler.processing.javac.kotlin
 
+import androidx.room.compiler.processing.XArrayType
+import androidx.room.compiler.processing.XEnumTypeElement
+import androidx.room.compiler.processing.XMethodElement
 import androidx.room.compiler.processing.XNullability
+import androidx.room.compiler.processing.javac.JavacKmAnnotation
+import androidx.room.compiler.processing.javac.JavacKmAnnotationValue
 import androidx.room.compiler.processing.javac.JavacProcessingEnv
 import androidx.room.compiler.processing.util.sanitizeAsJavaParameterName
 import javax.lang.model.element.Element
@@ -25,7 +30,10 @@
 import javax.tools.Diagnostic
 import kotlinx.metadata.Flag
 import kotlinx.metadata.Flags
+import kotlinx.metadata.KmAnnotation
+import kotlinx.metadata.KmAnnotationArgument
 import kotlinx.metadata.KmClass
+import kotlinx.metadata.KmClassifier
 import kotlinx.metadata.KmConstructor
 import kotlinx.metadata.KmFunction
 import kotlinx.metadata.KmProperty
@@ -50,10 +58,14 @@
 
     val type: KmTypeContainer by lazy {
         KmTypeContainer(
-            kmType = KmType(flags),
+            kmType = KmType(flags).apply {
+                classifier = KmClassifier.Class(kmClass.name)
+            },
             typeArguments = kmClass.typeParameters.map { kmTypeParameter ->
                 KmTypeContainer(
-                    kmType = KmType(kmTypeParameter.flags),
+                    kmType = KmType(kmTypeParameter.flags).apply {
+                        classifier = KmClassifier.Class(kmTypeParameter.name)
+                    },
                     typeArguments = emptyList(),
                     upperBounds = kmTypeParameter.upperBounds.map { it.asContainer() }
                 )
@@ -65,6 +77,10 @@
         kmClass.supertypes.firstOrNull()?.asContainer()
     }
 
+    val superTypes: List<KmTypeContainer> by lazy {
+        kmClass.supertypes.map { it.asContainer() }
+    }
+
     val typeParameters: List<KmTypeParameterContainer> by lazy {
         kmClass.typeParameters.map { it.asContainer() }
     }
@@ -265,6 +281,16 @@
 ) : KmFlags {
     override val flags: Flags
         get() = kmType.flags
+
+    val className: String? = kmType.classifier.let {
+        when (it) {
+            is KmClassifier.Class -> it.name.replace('/', '.')
+            else -> null
+        }
+    }
+
+    val annotations = kmType.annotations.map { it.asContainer() }
+
     fun isExtensionType() =
         kmType.annotations.any { it.className == "kotlin/ExtensionFunctionType" }
     fun isNullable() = Flag.Type.IS_NULLABLE(flags)
@@ -278,6 +304,49 @@
     )
 }
 
+internal class KmAnnotationContainer(private val kmAnnotation: KmAnnotation) {
+    val className = kmAnnotation.className.replace('/', '.')
+    fun getArguments(env: JavacProcessingEnv): Map<String, KmAnnotationArgumentContainer> {
+        return kmAnnotation.arguments.mapValues { (_, arg) ->
+            arg.asContainer(env)
+        }
+    }
+}
+
+internal class KmAnnotationArgumentContainer(
+    private val env: JavacProcessingEnv,
+    private val kmAnnotationArgument: KmAnnotationArgument
+) {
+    fun getValue(method: XMethodElement): Any? {
+        return kmAnnotationArgument.let {
+            when (it) {
+                is KmAnnotationArgument.LiteralValue<*> -> it.value
+                is KmAnnotationArgument.ArrayValue -> {
+                    it.elements.map {
+                        val valueType = (method.returnType as XArrayType).componentType
+                        JavacKmAnnotationValue(method, valueType, it.asContainer(env))
+                    }
+                }
+                is KmAnnotationArgument.EnumValue -> {
+                    val enumTypeElement = env.findTypeElement(
+                        it.enumClassName.replace('/', '.')) as XEnumTypeElement
+                    enumTypeElement.entries.associateBy { it.name }[it.enumEntryName]
+                }
+                is KmAnnotationArgument.AnnotationValue -> {
+                    val kmAnnotation = KmAnnotation(
+                        it.annotation.className,
+                        it.annotation.arguments
+                    ).asContainer()
+                    JavacKmAnnotation(env, kmAnnotation)
+                }
+                is KmAnnotationArgument.KClassValue -> {
+                    env.requireType(it.className.replace('/', '.'))
+                }
+            }
+        }
+    }
+}
+
 internal val KmTypeContainer.nullability: XNullability
     get() = if (isNullable()) {
         XNullability.NULLABLE
@@ -346,13 +415,14 @@
                 // it here since it is not valid name
                 name = "set-?".sanitizeAsJavaParameterName(0)
             ).apply { type = this@asContainer.returnType }
+            val returnType = KmType(0).apply { classifier = KmClassifier.Class("Unit") }
             KmPropertyFunctionContainerImpl(
                 flags = this.setterFlags,
                 name = JvmAbi.computeSetterName(this.name),
                 jvmName = it.name,
                 descriptor = it.asString(),
                 parameters = listOf(param.asContainer()),
-                returnType = KmType(0).asContainer(),
+                returnType = returnType.asContainer(),
             )
         },
     )
@@ -373,4 +443,9 @@
     KmValueParameterContainer(
         kmValueParameter = this,
         type = this.type.asContainer()
-    )
\ No newline at end of file
+    )
+
+private fun KmAnnotation.asContainer() = KmAnnotationContainer(this)
+
+private fun KmAnnotationArgument.asContainer(env: JavacProcessingEnv) =
+    KmAnnotationArgumentContainer(env, this)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotated.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotated.kt
index 1080617..4039290 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotated.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotated.kt
@@ -72,7 +72,7 @@
 
     override fun hasAnnotationWithPackage(pkg: String): Boolean {
         return annotations().any {
-            it.annotationType.resolve().declaration.qualifiedName?.getQualifier() == pkg
+            it.annotationType.resolve().declaration.packageName.asString() == pkg
         }
     }
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
index 51a0c6e..4e48afc 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
@@ -28,7 +28,9 @@
     val ksAnnotated: KSAnnotation
 ) : InternalXAnnotation() {
 
-    val ksType: KSType by lazy { ksAnnotated.annotationType.resolve() }
+    val ksType: KSType by lazy {
+        ksAnnotated.annotationType.resolve()
+    }
 
     override val name: String
         get() = ksAnnotated.shortName.asString()
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
index b0d03e1..d6b75dd 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
@@ -24,6 +24,7 @@
 import androidx.room.compiler.processing.tryBox
 import androidx.room.compiler.processing.tryUnbox
 import com.google.devtools.ksp.KspExperimental
+import com.google.devtools.ksp.symbol.KSAnnotation
 import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.google.devtools.ksp.symbol.KSType
 import com.google.devtools.ksp.symbol.KSTypeArgument
@@ -46,13 +47,13 @@
  * Similarly, we may not be able to get a [KSType] (e.g. if it resolves to error).
  */
 internal abstract class KspType(
-    val env: KspProcessingEnv,
+    env: KspProcessingEnv,
     val ksType: KSType,
     /**
      * Type resolver to convert KSType into its JVM representation.
      */
     protected val jvmTypeResolver: KspJvmTypeResolver?
-) : XType, XEquality {
+) : KspAnnotated(env), XType, XEquality {
     override val rawType by lazy {
         KspRawType(this)
     }
@@ -213,6 +214,8 @@
         }
     }
 
+    override fun annotations(): Sequence<KSAnnotation> = ksType.annotations
+
     override fun isNone(): Boolean {
         // even void is converted to Unit so we don't have none type in KSP
         // see: KspTypeTest.noneType
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
index d96e81d..2b79b8b 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
@@ -1106,6 +1106,158 @@
         }
     }
 
+    @Test
+    fun typeAnnotations() {
+        val kotlinSource = Source.kotlin(
+            "foo.bar.Subject.kt",
+            """
+            package foo.bar
+
+            interface MyInterface
+            open class Base
+
+            @Target(AnnotationTarget.TYPE)
+            annotation class A
+
+            class Subject(i: @A MyInterface) : @A Base(), @A MyInterface {
+                val p: @A MyInterface = TODO()
+                fun f(a: @A MyInterface): @A MyInterface = TODO()
+            }
+            """.trimIndent()
+        )
+        val javaSource = Source.java(
+            "foo.bar.Subject.java",
+            """
+            package foo.bar;
+            import java.lang.annotation.ElementType;
+            import java.lang.annotation.Target;
+            import java.lang.annotation.Repeatable;
+
+            interface MyInterface {}
+            class Base {}
+
+            @Target(ElementType.TYPE_USE)
+            @interface A {}
+
+            class Subject extends @A Base implements @A MyInterface {
+                Subject(@A MyInterface i) {}
+                @A MyInterface p;
+                @A MyInterface f(@A MyInterface a) {
+                    throw new RuntimeException();
+                }
+            }
+            """.trimIndent()
+        )
+
+        listOf(javaSource, kotlinSource).forEach { source ->
+            runTest(
+                sources = listOf(source)
+            ) { invocation ->
+                // We can't see type annotations from precompiled Java classes. Skipping it for now:
+                // https://github.com/google/ksp/issues/1296
+                if (source == javaSource && preCompiled) {
+                    return@runTest
+                }
+                val subject = invocation.processingEnv.requireTypeElement("foo.bar.Subject")
+                // There's an issue in KSP that prevents us from getting type annotations in
+                // places other than supertypes: https://github.com/google/ksp/issues/1325
+                val annotations = if (invocation.isKsp) {
+                    listOf(
+                        subject.superClass!!.getAllAnnotations().first(),
+                        subject.superInterfaces.first().getAllAnnotations().first(),
+                    )
+                } else {
+                    listOf(
+                        subject.superClass!!.getAllAnnotations().first(),
+                        subject.superInterfaces.first().getAllAnnotations().first(),
+                        subject.getDeclaredField("p").type.getAllAnnotations().first(),
+                        subject.getConstructors().first().parameters.first().type
+                            .getAllAnnotations().first(),
+                        subject.getMethodByJvmName("f").returnType
+                            .getAllAnnotations().first(),
+                        subject.getMethodByJvmName("f").parameters.first().type
+                            .getAllAnnotations().first()
+                    )
+                }
+                annotations.forEach { annotation ->
+                    assertThat(annotation.qualifiedName).isEqualTo("foo.bar.A")
+                }
+                assertThat(subject.superClass!!.hasAnnotationWithPackage("foo.bar")).isTrue()
+                subject.superInterfaces.forEach {
+                    assertThat(it.hasAnnotationWithPackage("foo.bar")).isTrue()
+                }
+            }
+        }
+    }
+
+    @Test
+    fun repeatedTypeAnnotations() {
+        val kotlinSource = Source.kotlin(
+            "foo.bar.Subject.kt",
+            """
+            package foo.bar
+
+            @Target(AnnotationTarget.TYPE)
+            @Repeatable
+            annotation class A(val value: Int)
+
+            open class Base
+
+            class Subject : @A(0) @A(1) Base()
+            """.trimIndent()
+        )
+        val javaSource = Source.java(
+            "foo.bar.Subject.java",
+            """
+            package foo.bar;
+            import java.lang.annotation.ElementType;
+            import java.lang.annotation.Target;
+            import java.lang.annotation.Repeatable;
+
+            class Base {}
+
+            @Repeatable(AContainer.class)
+            @Target(ElementType.TYPE_USE)
+            @interface A {
+                int value();
+            }
+
+            @Target(ElementType.TYPE_USE)
+            @interface AContainer {
+                A[] value();
+            }
+
+            class Subject extends @A(0) @A(1) Base {}
+            """.trimIndent()
+        )
+
+        listOf(javaSource, kotlinSource).forEach { source ->
+            runTest(
+                sources = listOf(source)
+            ) { invocation ->
+                // We can't see type annotations from precompiled Java classes. Skipping it for now:
+                // https://github.com/google/ksp/issues/1296
+                if (source == javaSource && preCompiled) {
+                    return@runTest
+                }
+                val subject = invocation.processingEnv.requireTypeElement("foo.bar.Subject")
+                val base = subject.superClass!!
+                assertThat(base.getAllAnnotations()[0].name)
+                    .isEqualTo("A")
+                assertThat(base.getAllAnnotations()[0].qualifiedName)
+                    .isEqualTo("foo.bar.A")
+                assertThat(base.getAllAnnotations()[0].annotationValues.first().asInt())
+                    .isEqualTo(0)
+                assertThat(base.getAllAnnotations()[1].name)
+                    .isEqualTo("A")
+                assertThat(base.getAllAnnotations()[1].qualifiedName)
+                    .isEqualTo("foo.bar.A")
+                assertThat(base.getAllAnnotations()[1].annotationValues.first().asInt())
+                    .isEqualTo(1)
+            }
+        }
+    }
+
     // helper function to read what we need
     private fun XAnnotated.getSuppressValues(): List<String>? {
         return this.findAnnotation<TestSuppressWarnings>()
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
index 3d05e0b..0ca863f 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
@@ -57,6 +57,7 @@
 class XAnnotationValueTest(
     private val isPreCompiled: Boolean,
     private val sourceKind: SourceKind,
+    private val isTypeAnnotation: Boolean,
 ) {
     private fun runTest(
         javaSource: Source.JavaSource,
@@ -104,34 +105,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     boolean booleanParam();
                     boolean[] booleanArrayParam();
                     boolean[] booleanVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     booleanParam = true,
                     booleanArrayParam = {true, false, true},
                     booleanVarArgsParam = {false, true, false}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    booleanParam = true,
+                    booleanArrayParam = {true, false, true},
+                    booleanVarArgsParam = {false, true, false}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val booleanParam: Boolean,
                     val booleanArrayParam: BooleanArray,
                     vararg val booleanVarArgsParam: Boolean,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     booleanParam = true,
                     booleanArrayParam = [true, false, true],
                     booleanVarArgsParam = [false, true, false],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    booleanParam = true,
+                    booleanArrayParam = [true, false, true],
+                    booleanVarArgsParam = [false, true, false],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -161,11 +180,7 @@
                     checkSingleValue(value, expectedValues[i])
                 }
             }
-
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -194,34 +209,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     int intParam();
                     int[] intArrayParam();
                     int[] intVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     intParam = (short) 1,
                     intArrayParam = {(byte) 3, (short) 5, 7},
                     intVarArgsParam = {(byte) 9, (short) 11, 13}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    intParam = (short) 1,
+                    intArrayParam = {(byte) 3, (short) 5, 7},
+                    intVarArgsParam = {(byte) 9, (short) 11, 13}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val intParam: Int,
                     val intArrayParam: IntArray,
                     vararg val intVarArgsParam: Int,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     intParam = 1,
                     intArrayParam = [3, 5, 7],
                     intVarArgsParam = [9, 11, 13],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    intParam = 1,
+                    intArrayParam = [3, 5, 7],
+                    intVarArgsParam = [9, 11, 13],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -252,10 +285,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -284,34 +314,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     short shortParam();
                     short[] shortArrayParam();
                     short[] shortVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     shortParam = (byte) 1,
                     shortArrayParam = {(byte) 3, (short) 5, 7},
                     shortVarArgsParam = {(byte) 9, (short) 11, 13}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    shortParam = (byte) 1,
+                    shortArrayParam = {(byte) 3, (short) 5, 7},
+                    shortVarArgsParam = {(byte) 9, (short) 11, 13}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val shortParam: Short,
                     val shortArrayParam: ShortArray,
                     vararg val shortVarArgsParam: Short,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     shortParam = 1,
                     shortArrayParam = [3, 5, 7],
                     shortVarArgsParam = [9, 11, 13],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    shortParam = 1,
+                    shortArrayParam = [3, 5, 7],
+                    shortVarArgsParam = [9, 11, 13],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -342,10 +390,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -374,34 +419,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     long longParam();
                     long[] longArrayParam();
                     long[] longVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     longParam = (byte) 1,
                     longArrayParam = {(short) 3, (int) 5, 7L},
                     longVarArgsParam = {(short) 9, (int) 11, 13L}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    longParam = (byte) 1,
+                    longArrayParam = {(short) 3, (int) 5, 7L},
+                    longVarArgsParam = {(short) 9, (int) 11, 13L}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val longParam: Long,
                     val longArrayParam: LongArray,
                     vararg val longVarArgsParam: Long,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     longParam = 1L,
                     longArrayParam = [3L, 5L, 7L],
                     longVarArgsParam = [9L, 11L, 13L],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    longParam = 1L,
+                    longArrayParam = [3L, 5L, 7L],
+                    longVarArgsParam = [9L, 11L, 13L],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -432,10 +495,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -464,34 +524,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     float floatParam();
                     float[] floatArrayParam();
                     float[] floatVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     floatParam = (byte) 1,
                     floatArrayParam = {(short) 3, 5.1F, 7.1F},
                     floatVarArgsParam = {9, 11.1F, 13.1F}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    floatParam = (byte) 1,
+                    floatArrayParam = {(short) 3, 5.1F, 7.1F},
+                    floatVarArgsParam = {9, 11.1F, 13.1F}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val floatParam: Float,
                     val floatArrayParam: FloatArray,
                     vararg val floatVarArgsParam: Float,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     floatParam = 1F,
                     floatArrayParam = [3F, 5.1F, 7.1F],
                     floatVarArgsParam = [9F, 11.1F, 13.1F],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    floatParam = 1F,
+                    floatArrayParam = [3F, 5.1F, 7.1F],
+                    floatVarArgsParam = [9F, 11.1F, 13.1F],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -522,10 +600,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -554,34 +629,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     double doubleParam();
                     double[] doubleArrayParam();
                     double[] doubleVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     doubleParam = (byte) 1,
                     doubleArrayParam = {(short) 3, 5.1F, 7.1},
                     doubleVarArgsParam = {9, 11.1F, 13.1}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    doubleParam = (byte) 1,
+                    doubleArrayParam = {(short) 3, 5.1F, 7.1},
+                    doubleVarArgsParam = {9, 11.1F, 13.1}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val doubleParam: Double,
                     val doubleArrayParam: DoubleArray,
                     vararg val doubleVarArgsParam: Double,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     doubleParam = 1.0,
                     doubleArrayParam = [3.0, 5.1, 7.1],
                     doubleVarArgsParam = [9.0, 11.1, 13.1],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    doubleParam = 1.0,
+                    doubleArrayParam = [3.0, 5.1, 7.1],
+                    doubleVarArgsParam = [9.0, 11.1, 13.1],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -612,9 +705,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
+            val annotation = getAnnotation(invocation)
             annotation.getAnnotationValue("doubleParam").value
             annotation.getAnnotationValue("doubleArrayParam").value
             annotation.getAnnotationValue("doubleVarArgsParam").value
@@ -676,34 +767,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     byte byteParam();
                     byte[] byteArrayParam();
                     byte[] byteVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     byteParam = (byte) 1,
                     byteArrayParam = {(byte) 3, (byte) 5, (byte) 7},
                     byteVarArgsParam = {(byte) 9, (byte) 11, (byte) 13}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    byteParam = (byte) 1,
+                    byteArrayParam = {(byte) 3, (byte) 5, (byte) 7},
+                    byteVarArgsParam = {(byte) 9, (byte) 11, (byte) 13}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val byteParam: Byte,
                     val byteArrayParam: ByteArray,
                     vararg val byteVarArgsParam: Byte,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     byteParam = 1,
                     byteArrayParam = [3, 5, 7],
                     byteVarArgsParam = [9, 11, 13],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    byteParam = 1,
+                    byteArrayParam = [3, 5, 7],
+                    byteVarArgsParam = [9, 11, 13],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -734,10 +843,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -766,34 +872,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     char charParam();
                     char[] charArrayParam();
                     char[] charVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     charParam = '1',
                     charArrayParam = {'2', '3', '4'},
                     charVarArgsParam = {'5', '6', '7'}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    charParam = '1',
+                    charArrayParam = {'2', '3', '4'},
+                    charVarArgsParam = {'5', '6', '7'}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val charParam: Char,
                     val charArrayParam: CharArray,
                     vararg val charVarArgsParam: Char,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     charParam = '1',
                     charArrayParam = ['2', '3', '4'],
                     charVarArgsParam = ['5', '6', '7'],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    charParam = '1',
+                    charArrayParam = ['2', '3', '4'],
+                    charVarArgsParam = ['5', '6', '7'],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -824,10 +948,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -856,34 +977,52 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     String stringParam();
                     String[] stringArrayParam();
                     String[] stringVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     stringParam = "1",
                     stringArrayParam = {"3", "5", "7"},
                     stringVarArgsParam = {"9", "11", "13"}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    stringParam = "1",
+                    stringArrayParam = {"3", "5", "7"},
+                    stringVarArgsParam = {"9", "11", "13"}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
                 "test.MyClass.kt",
                 """
                 package test
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val stringParam: String,
                     val stringArrayParam: Array<String>,
                     vararg val stringVarArgsParam: String,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     stringParam = "1",
                     stringArrayParam = ["3", "5", "7"],
                     stringVarArgsParam = ["9", "11", "13"],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    stringParam = "1",
+                    stringArrayParam = ["3", "5", "7"],
+                    stringVarArgsParam = ["9", "11", "13"],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -925,10 +1064,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -957,18 +1093,28 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
                 enum MyEnum {V1, V2, V3}
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     MyEnum enumParam();
                     MyEnum[] enumArrayParam();
                     MyEnum[] enumVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     enumParam = MyEnum.V1,
                     enumArrayParam = {MyEnum.V1, MyEnum.V2, MyEnum.V3},
                     enumVarArgsParam = {MyEnum.V3, MyEnum.V2, MyEnum.V1}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    enumParam = MyEnum.V1,
+                    enumArrayParam = {MyEnum.V1, MyEnum.V2, MyEnum.V3},
+                    enumVarArgsParam = {MyEnum.V3, MyEnum.V2, MyEnum.V1}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
@@ -976,17 +1122,25 @@
                 """
                 package test
                 enum class MyEnum {V1, V2, V3}
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val enumParam: MyEnum,
                     val enumArrayParam: Array<MyEnum>,
                     vararg val enumVarArgsParam: MyEnum,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     enumParam = MyEnum.V1,
                     enumArrayParam = [MyEnum.V1, MyEnum.V2, MyEnum.V3],
                     enumVarArgsParam = [MyEnum.V3, MyEnum.V2, MyEnum.V1],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    enumParam = MyEnum.V1,
+                    enumArrayParam = [MyEnum.V1, MyEnum.V2, MyEnum.V3],
+                    enumVarArgsParam = [MyEnum.V3, MyEnum.V2, MyEnum.V1],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -1031,10 +1185,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
                     @test.MyAnnotation(
@@ -1062,20 +1213,30 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
                 class C1 {}
                 class C2 {}
                 class C3 {}
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     Class<?> typeParam();
                     Class<?>[] typeArrayParam();
                     Class<?>[] typeVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     typeParam = C1.class,
                     typeArrayParam = {C1.class, C2.class, C3.class},
                     typeVarArgsParam = {C3.class, C2.class, C1.class}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    typeParam = C1.class,
+                    typeArrayParam = {C1.class, C2.class, C3.class},
+                    typeVarArgsParam = {C3.class, C2.class, C1.class}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
@@ -1085,17 +1246,25 @@
                 class C1
                 class C2
                 class C3
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val typeParam: kotlin.reflect.KClass<*>,
                     val typeArrayParam: Array<kotlin.reflect.KClass<*>>,
                     vararg val typeVarArgsParam: kotlin.reflect.KClass<*>,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     typeParam = C1::class,
                     typeArrayParam = [C1::class, C2::class, C3::class],
                     typeVarArgsParam = [C3::class, C2::class, C1::class],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    typeParam = C1::class,
+                    typeArrayParam = [C1::class, C2::class, C3::class],
+                    typeVarArgsParam = [C3::class, C2::class, C1::class],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -1154,10 +1323,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -1186,20 +1352,30 @@
                 "test.MyClass",
                 """
                 package test;
+                import java.lang.annotation.ElementType;
+                import java.lang.annotation.Target;
                 @interface A {
                     String value();
                 }
+                @Target({ElementType.TYPE, ElementType.TYPE_USE})
                 @interface MyAnnotation {
                     A annotationParam();
                     A[] annotationArrayParam();
                     A[] annotationVarArgsParam(); // There's no varargs in java so use array
                 }
+                interface MyInterface {}
                 @MyAnnotation(
                     annotationParam = @A("1"),
                     annotationArrayParam = {@A("3"), @A("5"), @A("7")},
                     annotationVarArgsParam = {@A("9"), @A("11"), @A("13")}
                 )
-                class MyClass {}
+                class MyClass implements
+                @MyAnnotation(
+                    annotationParam = @A("1"),
+                    annotationArrayParam = {@A("3"), @A("5"), @A("7")},
+                    annotationVarArgsParam = {@A("9"), @A("11"), @A("13")}
+                )
+                MyInterface {}
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
@@ -1207,17 +1383,25 @@
                 """
                 package test
                 annotation class A(val value: String)
+                @Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
                 annotation class MyAnnotation(
                     val annotationParam: A,
                     val annotationArrayParam: Array<A>,
                     vararg val annotationVarArgsParam: A,
                 )
+                interface MyInterface
                 @MyAnnotation(
                     annotationParam = A("1"),
                     annotationArrayParam = [A("3"), A("5"), A("7")],
                     annotationVarArgsParam = [A("9"), A("11"), A("13")],
                 )
-                class MyClass
+                class MyClass :
+                @MyAnnotation(
+                    annotationParam = A("1"),
+                    annotationArrayParam = [A("3"), A("5"), A("7")],
+                    annotationVarArgsParam = [A("9"), A("11"), A("13")],
+                )
+                MyInterface
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
@@ -1263,10 +1447,7 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
-                .getAllAnnotations()
-                .single { it.qualifiedName == "test.MyAnnotation" }
-
+            val annotation = getAnnotation(invocation)
             // Compare the AnnotationSpec string ignoring whitespace
             assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
                 .isEqualTo("""
@@ -1292,17 +1473,36 @@
         return this.replace("\\s+".toRegex(), "")
     }
 
+    private fun getAnnotation(invocation: XTestInvocation): XAnnotation {
+        val typeElement = invocation.processingEnv.requireTypeElement("test.MyClass")
+        return if (isTypeAnnotation) {
+            typeElement.superInterfaces.first().getAllAnnotations()
+                .single { it.qualifiedName == "test.MyAnnotation" }
+        } else {
+            typeElement.getAllAnnotations().single { it.qualifiedName == "test.MyAnnotation" }
+        }
+    }
+
     enum class SourceKind { JAVA, KOTLIN }
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "isPreCompiled_{0}_sourceKind_{1}")
+        @Parameterized.Parameters(name = "isPreCompiled_{0}_sourceKind_{1}_isTypeAnnotation_{2}")
         fun params(): List<Array<Any>> {
             val isPreCompiledValues = arrayOf(false, true)
             val sourceKindValues = arrayOf(SourceKind.JAVA, SourceKind.KOTLIN)
+            val isTypeAnnotation = arrayOf(false, true)
             return isPreCompiledValues.flatMap { isPreCompiled ->
-                sourceKindValues.map { sourceKind ->
-                    arrayOf(isPreCompiled, sourceKind)
+                sourceKindValues.flatMap { sourceKind ->
+                    isTypeAnnotation.mapNotNull { isTypeAnnotation ->
+                        // We can't see type annotations from precompiled Java classes. Skipping it
+                        // for now: https://github.com/google/ksp/issues/1296
+                        if (isPreCompiled && sourceKind == SourceKind.JAVA && isTypeAnnotation) {
+                            null
+                        } else {
+                            arrayOf(isPreCompiled, sourceKind, isTypeAnnotation)
+                        }
+                    }
                 }
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index e44db5b..9036fa2 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -19,6 +19,7 @@
 import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.asClassName
+import androidx.room.compiler.processing.javac.JavacType
 import androidx.room.compiler.processing.ksp.jvmDescriptor
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
@@ -255,6 +256,9 @@
                     assertThat(superInterface.typeArguments[0].asTypeName().kotlin)
                         .isEqualTo(KClassName("kotlin", "String"))
                 }
+                if (! invocation.isKsp) {
+                    assertThat((superInterface as JavacType).kotlinType).isNotNull()
+                }
             }
         }
     }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
index 835cdfd..724c037 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
@@ -24,6 +24,7 @@
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.asJClassName
 import androidx.room.compiler.processing.util.asKClassName
+import androidx.room.compiler.processing.util.compileFiles
 import androidx.room.compiler.processing.util.dumpToString
 import androidx.room.compiler.processing.util.getDeclaredField
 import androidx.room.compiler.processing.util.getDeclaredMethodByJvmName
@@ -1525,4 +1526,115 @@
             it.assertCompilationResult { hasErrorContaining("Unresolved reference: MissingType") }
         }
     }
+
+    @Test
+    fun hasAnnotationWithPackage() {
+        val kotlinSrc = Source.kotlin(
+            "KotlinClass.kt",
+            """
+            package foo.bar
+            interface KotlinInterface
+            open class KotlinBase
+            @Target(AnnotationTarget.TYPE)
+            annotation class KotlinAnnotation {
+                @Target(AnnotationTarget.TYPE)
+                annotation class KotlinNestedAnnotation
+            }
+            class KotlinClass : @KotlinAnnotation.KotlinNestedAnnotation KotlinBase(),
+                    @KotlinAnnotation KotlinInterface {
+                inner class KotlinInner : @KotlinAnnotation KotlinInterface
+                class KotlinNested : @KotlinAnnotation KotlinInterface
+            }
+            """.trimIndent()
+        )
+        // KSP can't read nested annotations in Java sources if the filename does not match
+        // the outer class.
+        val javaAnnotationSource = Source.java(
+            "foo.bar.JavaAnnotation",
+            """
+            package foo.bar;
+            import java.lang.annotation.ElementType;
+            import java.lang.annotation.Target;
+            @Target(ElementType.TYPE_USE)
+            @interface JavaAnnotation {
+                @Target(ElementType.TYPE_USE)
+                @interface JavaNestedAnnotation {}
+            }
+            """.trimIndent()
+        )
+        val javaSrc = Source.java(
+            "foo.bar.JavaClass",
+            """
+            package foo.bar;
+            interface JavaInterface {}
+            class JavaBase {}
+            class JavaClass extends @JavaAnnotation.JavaNestedAnnotation JavaBase
+                implements @JavaAnnotation JavaInterface {}
+            """.trimIndent()
+        )
+        fun checkKotlin(invocation: XTestInvocation) {
+            val kotlinTypeElement = invocation.processingEnv.requireTypeElement(
+                "foo.bar.KotlinClass")
+            kotlinTypeElement.superInterfaces.single().let {
+                assertThat(it.getAllAnnotations().single().typeElement.packageName)
+                        .isEqualTo("foo.bar")
+                assertThat(it.getAllAnnotations().single().typeElement.qualifiedName)
+                    .isEqualTo("foo.bar.KotlinAnnotation")
+
+                assertThat(it.hasAnnotationWithPackage("foo.bar.KotlinAnnotation")).isFalse()
+                assertThat(it.hasAnnotationWithPackage("foo.bar")).isTrue()
+                assertThat(it.hasAnnotationWithPackage("foo")).isFalse()
+            }
+            kotlinTypeElement.superClass!!.let {
+                assertThat(it.getAllAnnotations().single().typeElement.packageName)
+                    .isEqualTo("foo.bar")
+                assertThat(it.getAllAnnotations().single().typeElement.qualifiedName)
+                    .isEqualTo("foo.bar.KotlinAnnotation.KotlinNestedAnnotation")
+
+                assertThat(it.getAllAnnotations().single().typeElement.packageName)
+                    .isEqualTo("foo.bar")
+                assertThat(it.getAllAnnotations().single().typeElement.qualifiedName)
+                    .isEqualTo("foo.bar.KotlinAnnotation.KotlinNestedAnnotation")
+            }
+        }
+        fun checkJava(invocation: XTestInvocation) {
+            val javaTypeElement = invocation.processingEnv.requireTypeElement(
+                "foo.bar.JavaClass")
+            javaTypeElement.superInterfaces.first().let {
+                assertThat(it.getAllAnnotations().single().typeElement.packageName)
+                    .isEqualTo("foo.bar")
+                assertThat(it.getAllAnnotations().single().typeElement.qualifiedName)
+                    .isEqualTo("foo.bar.JavaAnnotation")
+
+                assertThat(it.hasAnnotationWithPackage("foo.bar.JavaClass")).isFalse()
+                assertThat(it.hasAnnotationWithPackage("foo.bar")).isTrue()
+                assertThat(it.hasAnnotationWithPackage("foo")).isFalse()
+            }
+            javaTypeElement.superClass!!.let {
+                assertThat(it.getAllAnnotations().single().typeElement.packageName)
+                    .isEqualTo("foo.bar")
+                assertThat(it.getAllAnnotations().single().typeElement.qualifiedName)
+                    .isEqualTo("foo.bar.JavaAnnotation.JavaNestedAnnotation")
+
+                assertThat(it.hasAnnotationWithPackage("foo.bar.JavaClass")).isFalse()
+                assertThat(it.hasAnnotationWithPackage("foo.bar")).isTrue()
+                assertThat(it.hasAnnotationWithPackage("foo")).isFalse()
+            }
+        }
+        runProcessorTest(
+            sources = listOf(kotlinSrc, javaAnnotationSource, javaSrc),
+            handler = {
+                checkKotlin(it)
+                checkJava(it)
+            }
+        )
+        runProcessorTest(
+            classpath = compileFiles(listOf(kotlinSrc)),
+            handler = {
+                // We can't see type annotations from precompiled Java classes. Skipping it
+                // for now: https://github.com/google/ksp/issues/1296
+                checkKotlin(it)
+            }
+        )
+    }
 }
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/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 20550af..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
@@ -504,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()
@@ -634,8 +639,7 @@
 
             PlaylistItem item = getCheckedPlaylistItem();
             if (item != null) {
-                long pos = item.getPosition() + (mSessionManager.isPaused()
-                        ? 0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
+                long pos = getCurrentEstimatedPosition(item);
                 mSessionManager.suspend(pos);
             }
             if (isPresentationApiSupported()) {
@@ -681,7 +685,7 @@
     /**
      * Controller Dialog Fragment for the media router dialog.
      */
-    private static class ControllerDialogFragment extends MediaRouteControllerDialogFragment {
+    public static class ControllerDialogFragment extends MediaRouteControllerDialogFragment {
         private MainActivity mMainActivity;
         private MediaRouteControllerDialog mControllerDialog;
         private CheckBox mUseDefaultControlCheckBox;
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 39575c3..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;
@@ -176,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
@@ -197,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
@@ -413,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/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-crypto/src/main/java/androidx/security/crypto/EncryptedFile.java b/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
index 9ecf09b..1a7bd69f 100644
--- a/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
+++ b/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
@@ -143,6 +143,10 @@
         /**
          * Builder for an EncryptedFile.
          *
+         * <p>If the <code>masterKeyAlias</code> used here is for a key that is not yet
+         * created, this method will not be thread safe. Use the alternate signature that is not
+         * deprecated for multi-threaded contexts.
+         *
          * @deprecated Use {@link #Builder(Context, File, MasterKey, FileEncryptionScheme)} instead.
          */
         @Deprecated
diff --git a/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java b/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
index 2060e40..d974cd3 100644
--- a/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
+++ b/security/security-crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
@@ -134,6 +134,12 @@
     /**
      * Opens an instance of encrypted SharedPreferences
      *
+     * <p>If the <code>masterKeyAlias</code> used here is for a key that is not yet created, this
+     * method will not be thread safe. Use the alternate signature that is not deprecated for
+     * multi-threaded contexts.
+     *
+     * @deprecated Use {@link #create(Context, String, MasterKey,
+     * PrefKeyEncryptionScheme, PrefValueEncryptionScheme)} instead.
      * @param fileName                  The name of the file to open; can not contain path
      *                                  separators.
      * @param masterKeyAlias            The alias of the master key to use.
@@ -143,8 +149,6 @@
      * @return The SharedPreferences instance that encrypts all data.
      * @throws GeneralSecurityException when a bad master key or keyset has been attempted
      * @throws IOException              when fileName can not be used
-     * @deprecated Use {@link #create(Context, String, MasterKey,
-     * PrefKeyEncryptionScheme, PrefValueEncryptionScheme)} instead.
      */
     @Deprecated
     @NonNull
diff --git a/security/security-crypto/src/main/java/androidx/security/crypto/MasterKeys.java b/security/security-crypto/src/main/java/androidx/security/crypto/MasterKeys.java
index 5734b8b..854d83f 100644
--- a/security/security-crypto/src/main/java/androidx/security/crypto/MasterKeys.java
+++ b/security/security-crypto/src/main/java/androidx/security/crypto/MasterKeys.java
@@ -54,6 +54,8 @@
     public static final KeyGenParameterSpec AES256_GCM_SPEC =
             createAES256GCMKeyGenParameterSpec(MASTER_KEY_ALIAS);
 
+    private static Object sLock = new Object();
+
     /**
      * Provides a safe and easy to use KenGenParameterSpec with the settings.
      * Algorithm: AES
@@ -92,9 +94,13 @@
             @NonNull KeyGenParameterSpec keyGenParameterSpec)
             throws GeneralSecurityException, IOException {
         validate(keyGenParameterSpec);
-        if (!MasterKeys.keyExists(keyGenParameterSpec.getKeystoreAlias())) {
-            generateKey(keyGenParameterSpec);
+
+        synchronized (sLock) {
+            if (!MasterKeys.keyExists(keyGenParameterSpec.getKeystoreAlias())) {
+                generateKey(keyGenParameterSpec);
+            }
         }
+
         return keyGenParameterSpec.getKeystoreAlias();
     }
 
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 4c67df4..e4063e7 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])
@@ -984,6 +986,7 @@
 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:window-samples", "window/window/samples", [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])
@@ -992,7 +995,9 @@
 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-demos:demo", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
+includeProject(":window:window-demos:demo-common", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
+includeProject(":window:window-demos:demo-second-app", [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(":work:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":work:work-benchmark", [BuildType.MAIN])
@@ -1008,6 +1013,14 @@
 
 /////////////////////////////
 //
+// Plugins
+//
+/////////////////////////////
+
+includeProject(":stableaidl:stableaidl-gradle-plugin", [BuildType.MAIN])
+
+/////////////////////////////
+//
 // Samples
 //
 /////////////////////////////
@@ -1017,7 +1030,7 @@
 // Note: don't add new samples/ apps. Instead, Create
 // <module>/integration-tests/testapp in the "Libraries" section above.
 includeProject(":androidx-demos", new File(samplesRoot, "AndroidXDemos"), [BuildType.MAIN])
-includeProject(":media-routing-demo", new File(samplesRoot, "MediaRoutingDemo"), [BuildType.MAIN])
+includeProject(":media-routing-demo", new File(samplesRoot, "MediaRoutingDemo"), [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":support-animation-demos", new File(samplesRoot, "SupportAnimationDemos"), [BuildType.MAIN])
 includeProject(":support-content-demos", new File(samplesRoot, "SupportContentDemos"), [BuildType.MAIN])
 includeProject(":support-emoji-demos", new File(samplesRoot, "SupportEmojiDemos"), [BuildType.MAIN])
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/slice/slice-view/src/main/res/values-ca/strings.xml b/slice/slice-view/src/main/res/values-ca/strings.xml
index c26df40..8038197 100644
--- a/slice/slice-view/src/main/res/values-ca/strings.xml
+++ b/slice/slice-view/src/main/res/values-ca/strings.xml
@@ -22,17 +22,17 @@
     <string name="abc_slice_show_more" msgid="1112789899890391107">"Mostra\'n més"</string>
     <string name="abc_slice_updated" msgid="7932359091871934205">"Actualitzat <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Fa <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Fa <xliff:g id="ID_2">%d</xliff:g> anys</item>
       <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> anys</item>
       <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> any</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many">Fa <xliff:g id="ID_2">%d</xliff:g> dies</item>
       <item quantity="other">Fa <xliff:g id="ID_2">%d</xliff:g> dies</item>
       <item quantity="one">Fa <xliff:g id="ID_1">%d</xliff:g> dia</item>
     </plurals>
diff --git a/slice/slice-view/src/main/res/values-es-rUS/strings.xml b/slice/slice-view/src/main/res/values-es-rUS/strings.xml
index 6d9e794..ce7b894 100644
--- a/slice/slice-view/src/main/res/values-es-rUS/strings.xml
+++ b/slice/slice-view/src/main/res/values-es-rUS/strings.xml
@@ -22,17 +22,17 @@
     <string name="abc_slice_show_more" msgid="1112789899890391107">"Mostrar más"</string>
     <string name="abc_slice_updated" msgid="7932359091871934205">"Actualización: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> años</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> años</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> año</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> días</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> días</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> día</item>
     </plurals>
diff --git a/slice/slice-view/src/main/res/values-es/strings.xml b/slice/slice-view/src/main/res/values-es/strings.xml
index 5cfad8d..d1421bf 100644
--- a/slice/slice-view/src/main/res/values-es/strings.xml
+++ b/slice/slice-view/src/main/res/values-es/strings.xml
@@ -22,17 +22,17 @@
     <string name="abc_slice_show_more" msgid="1112789899890391107">"Mostrar más"</string>
     <string name="abc_slice_updated" msgid="7932359091871934205">"Última actualización: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> años</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> años</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> año</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many">Hace <xliff:g id="ID_2">%d</xliff:g> días</item>
       <item quantity="other">Hace <xliff:g id="ID_2">%d</xliff:g> días</item>
       <item quantity="one">Hace <xliff:g id="ID_1">%d</xliff:g> día</item>
     </plurals>
diff --git a/slice/slice-view/src/main/res/values-it/strings.xml b/slice/slice-view/src/main/res/values-it/strings.xml
index 9f4f52b..8319289 100644
--- a/slice/slice-view/src/main/res/values-it/strings.xml
+++ b/slice/slice-view/src/main/res/values-it/strings.xml
@@ -22,17 +22,17 @@
     <string name="abc_slice_show_more" msgid="1112789899890391107">"Mostra altro"</string>
     <string name="abc_slice_updated" msgid="7932359091871934205">"Ultimo aggiornamento: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min fa</item>
       <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> min fa</item>
       <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> min fa</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> anni fa</item>
       <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> anni fa</item>
       <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> anno fa</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> giorni fa</item>
       <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> giorni fa</item>
       <item quantity="one"><xliff:g id="ID_1">%d</xliff:g> giorno fa</item>
     </plurals>
diff --git a/slice/slice-view/src/main/res/values-pt-rBR/strings.xml b/slice/slice-view/src/main/res/values-pt-rBR/strings.xml
index efe4af2..dd468de 100644
--- a/slice/slice-view/src/main/res/values-pt-rBR/strings.xml
+++ b/slice/slice-view/src/main/res/values-pt-rBR/strings.xml
@@ -23,17 +23,17 @@
     <string name="abc_slice_updated" msgid="7932359091871934205">"Atualizado <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
       <item quantity="one">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
       <item quantity="one">Há <xliff:g id="ID_2">%d</xliff:g> ano</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
       <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> dia atrás</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
       <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
     </plurals>
     <string name="abc_slice_error" msgid="1794214973158263497">"Não foi possível conectar"</string>
diff --git a/slice/slice-view/src/main/res/values-pt-rPT/strings.xml b/slice/slice-view/src/main/res/values-pt-rPT/strings.xml
index d486321..125ecbf 100644
--- a/slice/slice-view/src/main/res/values-pt-rPT/strings.xml
+++ b/slice/slice-view/src/main/res/values-pt-rPT/strings.xml
@@ -22,17 +22,17 @@
     <string name="abc_slice_show_more" msgid="1112789899890391107">"Mostrar mais"</string>
     <string name="abc_slice_updated" msgid="7932359091871934205">"Atualização: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> min</item>
       <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
       <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> ano</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g> dias</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> dias</item>
       <item quantity="one">Há <xliff:g id="ID_1">%d</xliff:g> dia</item>
     </plurals>
diff --git a/slice/slice-view/src/main/res/values-pt/strings.xml b/slice/slice-view/src/main/res/values-pt/strings.xml
index efe4af2..dd468de 100644
--- a/slice/slice-view/src/main/res/values-pt/strings.xml
+++ b/slice/slice-view/src/main/res/values-pt/strings.xml
@@ -23,17 +23,17 @@
     <string name="abc_slice_updated" msgid="7932359091871934205">"Atualizado <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="7664017844210142826">
       <item quantity="one">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> min ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g>min</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="2628491538787454021">
       <item quantity="one">Há <xliff:g id="ID_2">%d</xliff:g> ano</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> yr ago</item>
+      <item quantity="many">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
       <item quantity="other">Há <xliff:g id="ID_2">%d</xliff:g> anos</item>
     </plurals>
     <plurals name="abc_slice_duration_days" formatted="false" msgid="8356547162075064530">
       <item quantity="one"><xliff:g id="ID_2">%d</xliff:g> dia atrás</item>
-      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> days ago</item>
+      <item quantity="many"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
       <item quantity="other"><xliff:g id="ID_2">%d</xliff:g> dias atrás</item>
     </plurals>
     <string name="abc_slice_error" msgid="1794214973158263497">"Não foi possível conectar"</string>
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/startup/startup-runtime/build.gradle b/startup/startup-runtime/build.gradle
index 68d9455..9cfaac9 100644
--- a/startup/startup-runtime/build.gradle
+++ b/startup/startup-runtime/build.gradle
@@ -31,6 +31,10 @@
 }
 
 dependencies {
+    // Ideally startup would depend on profileinstaller so startup gets the benefit of its
+    // baseline profile rules, but profileinstaller calls startup APIs, so we have to avoid
+    // the circular dependency
+
     implementation("androidx.annotation:annotation:1.1.0")
     implementation("androidx.tracing:tracing:1.0.0")
     lintPublish(project(":startup:startup-runtime-lint"))
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/UiDeviceTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
index 0a753ac..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,12 +24,10 @@
 
 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;
@@ -280,6 +278,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 21) // Quick settings menu might not be present prior to API 21.
     public void testOpenQuickSettings() {
         mDevice.openQuickSettings();
 
@@ -446,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 7d70752..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
@@ -402,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());
     }
 
@@ -446,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());
     }
 
@@ -477,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());
     }
 
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 b3248e4..765aab1 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
@@ -53,7 +53,6 @@
                 mDefaultSwipeDeadZonePercentage);
     }
 
-    @Ignore // b/266965027
     @Test
     public void testGetChildByDescription() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -71,7 +70,6 @@
                         "This is non-existent"));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testGetChildByDescription_withoutScrollSearch() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -89,7 +87,6 @@
                         false));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testGetChildByInstance() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -106,7 +103,6 @@
                 1).exists());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testGetChildByText() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -123,7 +119,6 @@
                         "This is non-existent"));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testGetChildByText_withoutScrollSearch() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -140,7 +135,6 @@
                         "This is the bottom", false));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollDescriptionIntoView() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -156,7 +150,6 @@
         assertFalse(relativeLayout.scrollDescriptionIntoView("This is non-existent"));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollIntoView_withUiObject() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -174,7 +167,6 @@
         assertFalse(relativeLayout.scrollIntoView(nonExistentTarget));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollIntoView_withUiSelector() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -190,7 +182,6 @@
         assertFalse(relativeLayout.scrollIntoView(nonExistentTarget));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testEnsureFullyVisible() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -207,7 +198,6 @@
                         mDevice.findObject(new UiSelector().resourceId(TEST_APP + ":id/no_node"))));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollTextIntoView() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -223,7 +213,6 @@
         assertFalse(relativeLayout.scrollTextIntoView("This is non-existent"));
     }
 
-    @Ignore // b/266965027
     @Test
     public void testSetMaxSearchSwipesAndGetMaxSearchSwipes() {
         UiScrollable scrollable = new UiScrollable(new UiSelector()).setMaxSearchSwipes(5);
@@ -248,7 +237,6 @@
         assertUiObjectNotFound(noNode::flingForward);
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollForward_vertical() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -259,7 +247,6 @@
         assertTrue(scrollRegion.scrollForward());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollForward_horizontal() throws Exception {
         launchTestActivity(HorizontalScrollTestActivity.class);
@@ -310,7 +297,6 @@
         assertEquals("swipe_right", scrollRegion.getText());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToBeginning_withSteps() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -326,7 +312,6 @@
         assertTrue(topText.exists());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToBeginning_notEnoughSwipes_failed() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -342,7 +327,6 @@
         assertFalse(topText.exists());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToBeginning() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -370,7 +354,6 @@
         assertEquals("fling_up", flingRegion.getText());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToEnd_withSteps() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -385,7 +368,6 @@
         assertTrue(bottomText.exists());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToEnd_notEnoughSwipes_failed() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -400,7 +382,6 @@
         assertFalse(bottomText.exists());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testScrollToEnd() throws Exception {
         launchTestActivity(VerticalScrollTestActivity.class);
@@ -427,7 +408,6 @@
         assertEquals("fling_down", flingRegion.getText());
     }
 
-    @Ignore // b/266965027
     @Test
     public void testSetSwipeDeadZonePercentageAndGetSwipeDeadZonePercentage() {
         UiScrollable scrollable =
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/UiObject.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject.java
index 7d662bc..e9a106f 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject.java
@@ -353,7 +353,7 @@
      * @param node
      * @return null if node is null, else a Rect containing visible bounds
      */
-    private Rect getVisibleBounds(AccessibilityNodeInfo node) {
+    Rect getVisibleBounds(AccessibilityNodeInfo node) {
         if (node == null) {
             return null;
         }
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/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiScrollable.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiScrollable.java
index 047f4b4..8473756 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiScrollable.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiScrollable.java
@@ -397,8 +397,7 @@
         if(node == null) {
             throw new UiObjectNotFoundException(getSelector().toString());
         }
-        Rect rect = new Rect();
-        node.getBoundsInScreen(rect);
+        Rect rect = getVisibleBounds(node);
 
         int downX = 0;
         int downY = 0;
@@ -472,8 +471,7 @@
         if (node == null) {
             throw new UiObjectNotFoundException(getSelector().toString());
         }
-        Rect rect = new Rect();
-        node.getBoundsInScreen(rect);
+        Rect rect = getVisibleBounds(node);
 
         int downX = 0;
         int downY = 0;
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/IterableSubject.kt b/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/IterableSubject.kt
index b255881..3a3c4f6 100644
--- a/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/IterableSubject.kt
+++ b/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/IterableSubject.kt
@@ -519,4 +519,36 @@
                 }
             }
     }
+
+    /**
+     * @deprecated You probably meant to call [containsNoneOf] instead.
+     */
+    @Deprecated(
+        message = "You probably meant to call containsNoneOf instead.",
+        replaceWith = ReplaceWith(expression = "containsNoneOf"),
+    )
+    override fun isNoneOf(first: Any?, second: Any?, vararg rest: Any?) {
+        super.isNoneOf(first, second, *rest)
+    }
+
+    @Deprecated(
+        message = "You probably meant to call containsNoneIn instead.",
+        replaceWith = ReplaceWith(expression = "containsNoneIn"),
+    )
+    override fun isNotIn(iterable: Iterable<*>?) {
+        super.isNotIn(iterable)
+
+        requireNonNull(iterable)
+
+        val nonIterables = iterable.filterNot { it is Iterable<*> }
+        if (nonIterables.isNotEmpty()) {
+            fail(
+                "The actual value is an Iterable, and you've written a test that compares it to " +
+                    "some objects that are not Iterables. Did you instead mean to check " +
+                    "whether its *contents* match any of the *contents* of the given values? " +
+                    "If so, call containsNoneOf(...)/containsNoneIn(...) instead. " +
+                    "Non-iterables: $nonIterables"
+            )
+        }
+    }
 }
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 346a81d..8c5c948 100644
--- a/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt
+++ b/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt
@@ -18,6 +18,7 @@
 
 import kotlin.test.assertIs
 import kotlin.test.assertTrue
+import kotlin.test.fail
 
 // As opposed to Truth, which limits visibility on `actual` and the generic type, we purposely make
 // them visible in Kruth to allow for an easier time extending in Kotlin.
@@ -68,6 +69,30 @@
      * Fails if the subject is not an instance of the given class.
      */
     inline fun <reified V> isInstanceOf() = assertIs<V>(actual)
+
+    /** Fails unless the subject is equal to any element in the given [iterable]. */
+    open fun isIn(iterable: Iterable<*>?) {
+        if (actual !in requireNonNull(iterable)) {
+            fail("Expected $actual to be in $iterable, but was not")
+        }
+    }
+
+    /** Fails unless the subject is equal to any of the given elements. */
+    open fun isAnyOf(first: Any?, second: Any?, vararg rest: Any?) {
+        isIn(listOf(first, second, *rest))
+    }
+
+    /** Fails if the subject is equal to any element in the given [iterable]. */
+    open fun isNotIn(iterable: Iterable<*>?) {
+        if (actual in requireNonNull(iterable)) {
+            fail("Expected $actual not to be in $iterable, but it was")
+        }
+    }
+
+    /** Fails if the subject is equal to any of the given elements.  */
+    open fun isNoneOf(first: Any?, second: Any?, vararg rest: Any?) {
+        isNotIn(listOf(first, second, *rest))
+    }
 }
 
 private fun Any?.standardIsEqualTo(expected: Any?) {
diff --git a/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/IterableSubjectTest.kt b/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/IterableSubjectTest.kt
index e08ecda..fd3cd7e 100644
--- a/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/IterableSubjectTest.kt
+++ b/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/IterableSubjectTest.kt
@@ -1000,70 +1000,52 @@
         }
     }
 
-//
-//    private class Foo private constructor(val x: Int)
-//
-//    private class Bar(x: Int) : Foo(x)
-//
-//    private val FOO_COMPARATOR: Comparator<Foo> = object : Comparator<Foo?>() {
-//        fun compare(a: Foo, b: Foo): Int {
-//            return if (a.x < b.x) -1 else if (a.x > b.x) 1 else 0
-//        }
-//    }
-//
-//    @Test
-//    fun iterableOrderedByBaseClassComparator() {
-//        val targetList: Iterable<Bar> = listOf(Bar(1), Bar(2), Bar(3))
-//        assertThat(targetList).isInOrder(FOO_COMPARATOR)
-//        assertThat(targetList).isInStrictOrder(FOO_COMPARATOR)
-//    }
-//
-//    @Test
-//    fun isIn() {
-//        val actual: ImmutableList<String> = listOf("a")
-//        val expectedA: ImmutableList<String> = listOf("a")
-//        val expectedB: ImmutableList<String> = listOf("b")
-//        val expected: ImmutableList<ImmutableList<String>> = listOf(expectedA, expectedB)
-//        assertThat(actual).isIn(expected)
-//    }
-//
-//    @Test
-//    fun isNotIn() {
-//        val actual: ImmutableList<String> = listOf("a")
-//        assertThat(actual).isNotIn(listOf(listOf("b"), listOf("c")))
-//        expectFailureWhenTestingThat(actual).isNotIn(listOf("a", "b"))
-//        assertThat(expectFailure.getFailure())
-//            .hasMessageThat()
-//            .isEqualTo(
-//                "The actual value is an Iterable, and you've written a test that compares it to some "
-//                    + "objects that are not Iterables. Did you instead mean to check whether its "
-//                    + "*contents* match any of the *contents* of the given values? If so, call "
-//                    + "containsNoneOf(...)/containsNoneIn(...) instead. Non-iterables: [a, b]"
-//            )
-//    }
-//
-//    @Test
-//    fun isAnyOf() {
-//        val actual: ImmutableList<String> = listOf("a")
-//        val expectedA: ImmutableList<String> = listOf("a")
-//        val expectedB: ImmutableList<String> = listOf("b")
-//        assertThat(actual).isAnyOf(expectedA, expectedB)
-//    }
-//
-//    @Test
-//    fun isNoneOf() {
-//        val actual: ImmutableList<String> = listOf("a")
-//        assertThat(actual).isNoneOf(listOf("b"), listOf("c"))
-//        expectFailureWhenTestingThat(actual).isNoneOf("a", "b")
-//        assertThat(expectFailure.getFailure())
-//            .hasMessageThat()
-//            .isEqualTo(
-//                ("The actual value is an Iterable, and you've written a test that compares it to some "
-//                    + "objects that are not Iterables. Did you instead mean to check whether its "
-//                    + "*contents* match any of the *contents* of the given values? If so, call "
-//                    + "containsNoneOf(...)/containsNoneIn(...) instead. Non-iterables: [a, b]")
-//            )
-//    }
+    @Test
+    fun iterableOrderedByBaseClassComparator() {
+        val comparator = compareBy<Foo> { it.x }
+        val targetList: Iterable<Bar> = listOf(Bar(1), Bar(2), Bar(3))
+        assertThat(targetList).isInOrder(comparator)
+        assertThat(targetList).isInStrictOrder(comparator)
+    }
+
+    @Test
+    fun isIn() {
+        val actual = listOf("a")
+        val expectedA = listOf("a")
+        val expectedB = listOf("b")
+        val expected = listOf(expectedA, expectedB)
+        assertThat(actual).isIn(expected)
+    }
+
+    @Suppress("DEPRECATION") // Testing a deprecated method
+    @Test
+    fun isNotIn() {
+        val actual = listOf("a")
+        assertThat(actual).isNotIn(listOf(listOf("b"), listOf("c")))
+
+        assertFailsWith<AssertionError> {
+            assertThat(actual).isNotIn(listOf("a", "b"))
+        }
+    }
+
+    @Test
+    fun isAnyOf() {
+        val actual = listOf("a")
+        val expectedA = listOf("a")
+        val expectedB = listOf("b")
+        assertThat(actual).isAnyOf(expectedA, expectedB)
+    }
+
+    @Suppress("DEPRECATION") // Testing a deprecated method
+    @Test
+    fun isNoneOf() {
+        val actual = listOf("a")
+        assertThat(actual).isNoneOf(listOf("b"), listOf("c"))
+
+        assertFailsWith<AssertionError> {
+            assertThat(actual).isNoneOf("a", "b")
+        }
+    }
 
     private companion object {
         private val COMPARE_AS_DECIMAL: Comparator<String?> =
@@ -1088,4 +1070,8 @@
 
         override fun toString(): String = "HCT"
     }
+
+    private open class Foo(val x: Int)
+
+    private class Bar(x: Int) : Foo(x)
 }
diff --git a/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/SubjectTest.kt b/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/SubjectTest.kt
index fed8784..c2d784c 100644
--- a/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/SubjectTest.kt
+++ b/testutils/testutils-kmp/src/commonTest/kotlin/androidx/kruth/SubjectTest.kt
@@ -153,6 +153,142 @@
             assertThat(StringBuilder("foo")).isEqualTo(StringBuilder("foo"))
         }
     }
+
+    @Test
+    fun isIn() {
+        assertThat("b").isIn(oneShotIterable("a", "b", "c"))
+    }
+
+    @Test
+    fun isInJustTwo() {
+        assertThat("b").isIn(oneShotIterable("a", "b"))
+    }
+
+    @Test
+    fun isInFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat("x").isIn(oneShotIterable("a", "b", "c"))
+        }
+    }
+
+    @Test
+    fun isInNullInListWithNull() {
+        assertThat(null as String?).isIn(oneShotIterable("a", "b", null as String?))
+    }
+
+    @Test
+    fun isInNonnullInListWithNull() {
+        assertThat("b").isIn(oneShotIterable("a", "b", null as String?))
+    }
+
+    @Test
+    fun isInNullFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).isIn(oneShotIterable("a", "b", "c"))
+        }
+    }
+
+    @Test
+    fun isInEmptyFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat("b").isIn(emptyList<String>())
+        }
+    }
+
+    @Test
+    fun isAnyOf() {
+        assertThat("b").isAnyOf("a", "b", "c")
+    }
+
+    @Test
+    fun isAnyOfJustTwo() {
+        assertThat("b").isAnyOf("a", "b")
+    }
+
+    @Test
+    fun isAnyOfFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat("x").isAnyOf("a", "b", "c")
+        }
+    }
+
+    @Test
+    fun isAnyOfNullInListWithNull() {
+        assertThat(null as String?).isAnyOf("a", "b", null as String?)
+    }
+
+    @Test
+    fun isAnyOfNonnullInListWithNull() {
+        assertThat("b").isAnyOf("a", "b", null as String?)
+    }
+
+    @Test
+    fun isAnyOfNullFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).isAnyOf("a", "b", "c")
+        }
+    }
+
+    @Test
+    fun isNotIn() {
+        assertThat("x").isNotIn(oneShotIterable("a", "b", "c"))
+    }
+
+    @Test
+    fun isNotInFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat("b").isNotIn(oneShotIterable("a", "b", "c"))
+        }
+    }
+
+    @Test
+    fun isNotInNull() {
+        assertThat(null as String?).isNotIn(oneShotIterable("a", "b", "c"))
+    }
+
+    @Test
+    fun isNotInNullFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).isNotIn(oneShotIterable("a", "b", null as String?))
+        }
+    }
+
+    @Test
+    fun isNotInEmpty() {
+        assertThat("b").isNotIn(emptyList<String>())
+    }
+
+    @Test
+    fun isNoneOf() {
+        assertThat("x").isNoneOf("a", "b", "c")
+    }
+
+    @Test
+    fun isNoneOfFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat("b").isNoneOf("a", "b", "c")
+        }
+    }
+
+    @Test
+    fun isNoneOfNull() {
+        assertThat(null as String?).isNoneOf("a", "b", "c")
+    }
+
+    @Test
+    fun isNoneOfNullFailure() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).isNoneOf("a", "b", null as String?)
+        }
+    }
+
+    private fun <T> oneShotIterable(vararg values: T): Iterable<T> =
+        object : Iterable<T> {
+            private val iterator = values.iterator()
+
+            override fun iterator(): Iterator<T> = iterator
+            override fun toString(): String = values.contentToString()
+        }
 }
 
 @Suppress("EqualsOrHashCode")
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-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
index 9f3f678..6c85c25 100644
--- a/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
+++ b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
@@ -93,12 +93,37 @@
     startActivityAndWait(intent)
 }
 
+/**
+ * Baseline Profile compilation mode is considered primary, and always worth measuring
+ */
+private fun CompilationMode.isPrimary(): Boolean {
+    return if (Build.VERSION.SDK_INT < 24) {
+        true
+    } else {
+        this is CompilationMode.Partial &&
+            this.warmupIterations == 0 &&
+            (this.baselineProfileMode == BaselineProfileMode.UseIfAvailable ||
+                this.baselineProfileMode == BaselineProfileMode.Require)
+    }
+}
+
 fun createStartupCompilationParams(
     startupModes: List<StartupMode> = STARTUP_MODES,
     compilationModes: List<CompilationMode> = COMPILATION_MODES
 ): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
+    // To save CI resources, avoid measuring startup combinations which have non-primary
+    // compilation or startup mode (BP, cold respectively) in the default case
+    val minimalIntersection = startupModes == STARTUP_MODES && compilationModes == COMPILATION_MODES
+
     for (startupMode in startupModes) {
         for (compilationMode in compilationModes) {
+            if (minimalIntersection &&
+                startupMode != StartupMode.COLD &&
+                !compilationMode.isPrimary()
+            ) {
+                continue
+            }
+
             // Skip configs that can't run, so they don't clutter Studio benchmark
             // output with AssumptionViolatedException dumps
             if (compilationMode.isSupportedWithVmSettings()) {
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/testutils/testutils-paparazzi/build.gradle b/testutils/testutils-paparazzi/build.gradle
index 4128c88..aeb9d21 100644
--- a/testutils/testutils-paparazzi/build.gradle
+++ b/testutils/testutils-paparazzi/build.gradle
@@ -25,7 +25,12 @@
 BundleInsideHelper.forInsideJar(
         project,
         "com.google.protobuf",
-        "androidx.testutils.paparazzi.protobuf"
+        // b/268288856 untangle this mess.
+        // Currently this has to match test/screenshot/screenshot/build.gradle because sometimes
+        // both :internal-testutils-paparazzi and :test:screenshot:screenshot are added to the
+        // classpath and picking a different package will cause missing class exceptions due to
+        // class shadowing
+        "androidx.test.screenshot.protobuf"
 )
 
 dependencies {
diff --git a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/AndroidXPaparazzi.kt b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/AndroidXPaparazzi.kt
index b8723d9..80325ec 100644
--- a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/AndroidXPaparazzi.kt
+++ b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/AndroidXPaparazzi.kt
@@ -38,7 +38,7 @@
     deviceConfig: DeviceConfig = DeviceConfig.PIXEL_6.copy(softButtons = false),
     theme: String = "android:Theme.Material.NoActionBar.Fullscreen",
     renderingMode: RenderingMode = RenderingMode.SHRINK,
-    imageDiffer: ImageDiffer = ImageDiffer.PixelPerfect
+    imageDiffer: ImageDiffer = ImageDiffer.MSSIMMatcher
 ) = Paparazzi(
     deviceConfig = deviceConfig,
     theme = theme,
diff --git a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/GoldenVerifier.kt b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/GoldenVerifier.kt
index bfca2c7..32589d1 100644
--- a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/GoldenVerifier.kt
+++ b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/GoldenVerifier.kt
@@ -92,7 +92,7 @@
         val analysis = analyze(expected, actual)
 
         fun updateMessage() = "To update golden images for this test module, run " +
-            "${updateGoldenGradleTask()}."
+            "${updateGoldenGradleCommand()}."
 
         writeReport(snapshot, analysis)
 
@@ -110,8 +110,8 @@
             )
             is AnalysisResult.MissingGolden -> throw AssertionError(
                 "Expected golden image for test \"${snapshot.testName.methodName}\" does not " +
-                    "exist. Run ${updateGoldenGradleTask()} to create it and update all golden " +
-                    "images for this test module."
+                    "exist. Run ${updateGoldenGradleCommand()} " +
+                    "to create it and update all golden images for this test module."
             )
         }
     }
@@ -248,8 +248,10 @@
         const val ANDROIDX_GOLDEN_REPO_NAME = "platform/frameworks/support-golden"
 
         /** Name of the updateGolden Gradle command for this module, via system properties. */
-        fun updateGoldenGradleTask() =
-            System.getProperty("$PACKAGE_NAME.updateGoldenTask") ?: ":updateGolden"
+        fun updateGoldenGradleCommand() =
+            "./gradlew ${
+                (System.getProperty("$PACKAGE_NAME.updateGoldenTask") ?: ":updateGolden")
+            } -Pandroidx.ignoreTestFailures=true"
 
         /** Render test function name as a fully qualified string. */
         fun TestName.toQualifiedName(): String {
diff --git a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/ImageDiffer.kt b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/ImageDiffer.kt
index 201f12e..eabb43b 100644
--- a/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/ImageDiffer.kt
+++ b/testutils/testutils-paparazzi/src/main/kotlin/androidx/testutils/paparazzi/ImageDiffer.kt
@@ -18,6 +18,7 @@
 
 import androidx.testutils.paparazzi.ImageDiffer.DiffResult.Similar
 import java.awt.image.BufferedImage
+import kotlin.math.pow
 
 @JvmDefaultWithCompatibility
 /**
@@ -105,8 +106,256 @@
         }
     }
 
+    /**
+     * Image comparison using Structural Similarity Index, developed by Wang, Bovik, Sheikh, and
+     * Simoncelli. Details can be read in their paper:
+     * https://ece.uwaterloo.ca/~z70wang/publications/ssim.pdf
+     */
+    object MSSIMMatcher : ImageDiffer {
+        override fun diff(a: BufferedImage, b: BufferedImage): DiffResult {
+            val aIntArray = a.toIntArray()
+            val bIntArray = b.toIntArray()
+            val SSIMTotal = calculateSSIM(aIntArray, bIntArray, a.width, a.height)
+
+            val stats = "[MSSIM] Required SSIM: $SSIM_THRESHOLD, Actual " +
+                "SSIM: " + "%.3f".format(SSIMTotal)
+            if (SSIMTotal >= SSIM_THRESHOLD) {
+                return DiffResult.Similar(stats)
+            }
+            return PixelPerfect.diff(a, b)
+        }
+
+        internal fun calculateSSIM(
+            ideal: IntArray,
+            given: IntArray,
+            width: Int,
+            height: Int
+        ): Double {
+            return calculateSSIM(ideal, given, 0, width, width, height)
+        }
+
+        private fun calculateSSIM(
+            ideal: IntArray,
+            given: IntArray,
+            offset: Int,
+            stride: Int,
+            width: Int,
+            height: Int
+        ): Double {
+            var SSIMTotal = 0.0
+            var windows = 0
+            var currentWindowY = 0
+            while (currentWindowY < height) {
+                val windowHeight = computeWindowSize(currentWindowY, height)
+                var currentWindowX = 0
+                while (currentWindowX < width) {
+                    val windowWidth = computeWindowSize(currentWindowX, width)
+                    val start: Int =
+                        indexFromXAndY(currentWindowX, currentWindowY, stride, offset)
+                    if (isWindowWhite(ideal, start, stride, windowWidth, windowHeight) &&
+                        isWindowWhite(given, start, stride, windowWidth, windowHeight)
+                    ) {
+                        currentWindowX += WINDOW_SIZE
+                        continue
+                    }
+                    windows++
+                    val means =
+                        getMeans(ideal, given, start, stride, windowWidth, windowHeight)
+                    val meanX = means[0]
+                    val meanY = means[1]
+                    val variances = getVariances(
+                        ideal, given, meanX, meanY, start, stride,
+                        windowWidth, windowHeight
+                    )
+                    val varX = variances[0]
+                    val varY = variances[1]
+                    val stdBoth = variances[2]
+                    val SSIM = SSIM(meanX, meanY, varX, varY, stdBoth)
+                    SSIMTotal += SSIM
+                    currentWindowX += WINDOW_SIZE
+                }
+                currentWindowY += WINDOW_SIZE
+            }
+            if (windows == 0) {
+                return 1.0
+            }
+            return SSIMTotal / windows.toDouble()
+        }
+
+        /**
+         * Compute the size of the window. The window defaults to WINDOW_SIZE, but
+         * must be contained within dimension.
+         */
+        private fun computeWindowSize(coordinateStart: Int, dimension: Int): Int {
+            return if (coordinateStart + WINDOW_SIZE <= dimension) {
+                WINDOW_SIZE
+            } else {
+                dimension - coordinateStart
+            }
+        }
+
+        private fun isWindowWhite(
+            colors: IntArray,
+            start: Int,
+            stride: Int,
+            windowWidth: Int,
+            windowHeight: Int
+        ): Boolean {
+            for (y in 0 until windowHeight) {
+                for (x in 0 until windowWidth) {
+                    if (colors[indexFromXAndY(x, y, stride, start)] != WHITE) {
+                        return false
+                    }
+                }
+            }
+            return true
+        }
+
+        /**
+         * This calculates the position in an array that would represent a bitmap given the parameters.
+         */
+        private fun indexFromXAndY(x: Int, y: Int, stride: Int, offset: Int): Int {
+            return x + y * stride + offset
+        }
+
+        private fun SSIM(
+            muX: Double,
+            muY: Double,
+            sigX: Double,
+            sigY: Double,
+            sigXY: Double
+        ): Double {
+            var SSIM = (2 * muX * muY + CONSTANT_C1) * (2 * sigXY + CONSTANT_C2)
+            val denom = ((muX * muX + muY * muY + CONSTANT_C1) * (sigX + sigY + CONSTANT_C2))
+            SSIM /= denom
+            return SSIM
+        }
+
+        /**
+         * This method will find the mean of a window in both sets of pixels. The return is an array
+         * where the first double is the mean of the first set and the second double is the mean of the
+         * second set.
+         */
+        private fun getMeans(
+            pixels0: IntArray,
+            pixels1: IntArray,
+            start: Int,
+            stride: Int,
+            windowWidth: Int,
+            windowHeight: Int
+        ): DoubleArray {
+            var avg0 = 0.0
+            var avg1 = 0.0
+            for (y in 0 until windowHeight) {
+                for (x in 0 until windowWidth) {
+                    val index: Int = indexFromXAndY(x, y, stride, start)
+                    avg0 += getIntensity(pixels0[index])
+                    avg1 += getIntensity(pixels1[index])
+                }
+            }
+            avg0 /= windowWidth * windowHeight.toDouble()
+            avg1 /= windowWidth * windowHeight.toDouble()
+            return doubleArrayOf(avg0, avg1)
+        }
+
+        /**
+         * Finds the variance of the two sets of pixels, as well as the covariance of the windows. The
+         * return value is an array of doubles, the first is the variance of the first set of pixels,
+         * the second is the variance of the second set of pixels, and the third is the covariance.
+         */
+        private fun getVariances(
+            pixels0: IntArray,
+            pixels1: IntArray,
+            mean0: Double,
+            mean1: Double,
+            start: Int,
+            stride: Int,
+            windowWidth: Int,
+            windowHeight: Int
+        ): DoubleArray {
+            var var0 = 0.0
+            var var1 = 0.0
+            var varBoth = 0.0
+            for (y in 0 until windowHeight) {
+                for (x in 0 until windowWidth) {
+                    val index: Int = indexFromXAndY(x, y, stride, start)
+                    val v0 = getIntensity(pixels0[index]) - mean0
+                    val v1 = getIntensity(pixels1[index]) - mean1
+                    var0 += v0 * v0
+                    var1 += v1 * v1
+                    varBoth += v0 * v1
+                }
+            }
+            var0 /= windowWidth * windowHeight - 1.toDouble()
+            var1 /= windowWidth * windowHeight - 1.toDouble()
+            varBoth /= windowWidth * windowHeight - 1.toDouble()
+            return doubleArrayOf(var0, var1, varBoth)
+        }
+
+        /**
+         * Gets the intensity of a given pixel in RGB using luminosity formula
+         *
+         * l = 0.21R' + 0.72G' + 0.07B'
+         *
+         * The prime symbols dictate a gamma correction of 1.
+         */
+        private fun getIntensity(pixel: Int): Double {
+            val gamma = 1.0
+            var l = 0.0
+            l += 0.21f * (red(pixel) / 255f.toDouble()).pow(gamma)
+            l += 0.72f * (green(pixel) / 255f.toDouble()).pow(gamma)
+            l += 0.07f * (blue(pixel) / 255f.toDouble()).pow(gamma)
+            return l
+        }
+
+        /**
+         * Return the red component of a color int. This is the same as saying
+         * (color >> 16) & 0xFF
+         */
+        fun red(color: Int): Int {
+            return color shr 16 and 0xFF
+        }
+
+        /**
+         * Return the green component of a color int. This is the same as saying
+         * (color >> 8) & 0xFF
+         */
+        fun green(color: Int): Int {
+            return color shr 8 and 0xFF
+        }
+
+        /**
+         * Return the blue component of a color int. This is the same as saying
+         * color & 0xFF
+         */
+        fun blue(color: Int): Int {
+            return color and 0xFF
+        }
+
+        private fun BufferedImage.toIntArray(): IntArray {
+            val bitmapArray = IntArray(width * height)
+            for (x in 0 until width) {
+                for (y in 0 until height) {
+                    bitmapArray[y * width + x] = getRGB(x, y)
+                }
+            }
+            return bitmapArray
+        }
+    }
+
     private companion object {
         const val MAGENTA = 0xFF_FF_00_FFu
         const val TRANSPARENT = 0x00_FF_FF_FFu
+        const val WHITE = 0xFFFFFF
+
+        // These values were taken from the publication
+        private const val CONSTANT_L = 254.0
+        private const val CONSTANT_K1 = 0.00001
+        private const val CONSTANT_K2 = 0.00003
+        private val CONSTANT_C1 = (CONSTANT_L * CONSTANT_K1).pow(2.0)
+        private val CONSTANT_C2 = (CONSTANT_L * CONSTANT_K2).pow(2.0)
+        private const val WINDOW_SIZE = 10
+
+        private val SSIM_THRESHOLD: Double = 0.98
     }
 }
\ No newline at end of file
diff --git a/testutils/testutils-paparazzi/src/test/kotlin/androidx/testutils/paparazzi/GoldenVerifierTest.kt b/testutils/testutils-paparazzi/src/test/kotlin/androidx/testutils/paparazzi/GoldenVerifierTest.kt
index 6a460df..0a99763 100644
--- a/testutils/testutils-paparazzi/src/test/kotlin/androidx/testutils/paparazzi/GoldenVerifierTest.kt
+++ b/testutils/testutils-paparazzi/src/test/kotlin/androidx/testutils/paparazzi/GoldenVerifierTest.kt
@@ -111,7 +111,8 @@
     fun `asserts on failure`() {
         createGolden("star")
         val message = "Actual image differs from golden image: 17837 of 65536 pixels different. " +
-            "To update golden images for this test module, run :updateGolden."
+            "To update golden images for this test module, run ./gradlew :updateGolden " +
+            "-Pandroidx.ignoreTestFailures=true."
 
         assertFailsWithMessage(message) {
             goldenVerifier().assertMatchesGolden(snapshot(), loadTestImage("circle"))
@@ -165,7 +166,8 @@
     fun `asserts on size mismatch`() {
         createGolden("horizontal_rectangle")
         val message = "Actual image has different dimensions than golden image. Actual: 72x128. " +
-            "Golden: 128x72. To update golden images for this test module, run :updateGolden."
+            "Golden: 128x72. To update golden images for this test module, run ./gradlew " +
+            ":updateGolden -Pandroidx.ignoreTestFailures=true."
 
         assertFailsWithMessage(message) {
             goldenVerifier().assertMatchesGolden(snapshot(), loadTestImage("vertical_rectangle"))
@@ -219,8 +221,8 @@
     @Test
     fun `asserts on missing golden`() {
         val message = "Expected golden image for test \"asserts on missing golden\" does not " +
-            "exist. Run :updateGolden to create it and update all golden images for this test " +
-            "module."
+            "exist. Run ./gradlew :updateGolden -Pandroidx.ignoreTestFailures=true to create it " +
+            "and update all golden images for this test module."
 
         assertFailsWithMessage(message) {
             goldenVerifier().assertMatchesGolden(snapshot(), loadTestImage("circle"))
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/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc b/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
index 72776fc..e634a06 100644
--- a/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
+++ b/tracing/tracing-perfetto-binary/src/main/cpp/tracing_perfetto.cc
@@ -25,7 +25,7 @@
 // Concept of version useful e.g. for human-readable error messages, and stable once released.
 // Does not replace the need for a binary verification mechanism (e.g. checksum check).
 // TODO: populate using CMake
-#define VERSION "1.0.0-alpha10"
+#define VERSION "1.0.0-alpha11"
 
 namespace tracing_perfetto {
     void RegisterWithPerfetto() {
diff --git a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
index 7178a50..753b9d8 100644
--- a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
+++ b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/jni/test/PerfettoNativeTest.kt
@@ -30,7 +30,7 @@
         init {
             PerfettoNative.loadLib()
         }
-        const val libraryVersion = "1.0.0-alpha10" // TODO: get using reflection
+        const val libraryVersion = "1.0.0-alpha11" // TODO: get using reflection
     }
 
     @Test
diff --git a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/security/SafeLibLoaderTest.kt b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/security/SafeLibLoaderTest.kt
index 6a0500f..ecece91 100644
--- a/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/security/SafeLibLoaderTest.kt
+++ b/tracing/tracing-perfetto/src/androidTest/java/androidx/tracing/perfetto/security/SafeLibLoaderTest.kt
@@ -104,7 +104,7 @@
         dstDir.resolve(libFileName).also { dstFile ->
             val srcZip = ZipFile(File(context.applicationInfo.publicSourceDir))
             val libEntry = srcZip.entries().asSequence()
-                .single { entry -> entry.name.matches(Regex(".*lib/.*$abi.*/$libFileName")) }
+                .single { entry -> entry.name.matches(Regex(".*lib/$abi/$libFileName")) }
             srcZip.getInputStream(libEntry).use { src ->
                 dstFile.outputStream().use { dst -> src.copyTo(dst) }
             }
@@ -121,4 +121,4 @@
             .digest()
             .joinToString(separator = "") { "%02x".format(it) }
             .also { assertThat(it).matches("[0-9a-f]{64}") }
-}
\ No newline at end of file
+}
diff --git a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
index 5278ec7..a328d3b 100644
--- a/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
+++ b/tracing/tracing-perfetto/src/main/java/androidx/tracing/perfetto/jni/PerfettoNative.kt
@@ -25,12 +25,12 @@
 
     // TODO(224510255): load from a file produced at build time
     object Metadata {
-        const val version = "1.0.0-alpha10"
+        const val version = "1.0.0-alpha11"
         val checksums = mapOf(
-            "arm64-v8a" to "189348f277f588ff41f51b4284bf0568bf3d0eab786f6664f8d66847694e0674",
-            "armeabi-v7a" to "9550b32340d790d58fe069b3882815e3d2b20474aa634f01e448392e898cc95b",
-            "x86" to "07967aaad711d16f35f509783f56139903f28f661ebb0415522c10fc0453810f",
-            "x86_64" to "6b2f4129cb1e52d9c9dca5b89d575c7b2a905670da2e0474917d37223f0c8bf5",
+            "arm64-v8a" to "7b593d218cd0d2938b527779f2797e87ddb7d6c042cc5bf1f12543f103a9c291",
+            "armeabi-v7a" to "5c19ff0e61035b7dbdc450642e16761a8948f588ee523adfc329e10f854499b4",
+            "x86" to "2544cdb37d037b5c9976a55d032712c4642a92d1eab22210f9e2831a5df6531a",
+            "x86_64" to "5214e2a413835b2b7328055f50399aa8ae1be28b63a030193003406bf441ac61",
         )
     }
 
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/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/list/LazyColumnTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyColumnTest.kt
index 177a0a7..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
@@ -254,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()
+                }
             }
         }
     }
@@ -362,7 +358,7 @@
             .assertIsDisplayed()
 
         rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerTest.kt
index 98ba1e9..53c3a19 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerTest.kt
@@ -38,6 +38,7 @@
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 
@@ -250,6 +251,7 @@
             .assertIsNotPlaced()
     }
 
+    @Ignore // b/268720713
     @Test
     fun pinnedItemIsStillPinnedWhenReorderedAndNotVisibleAnymore() {
         val state = TvLazyListState()
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..cec085f 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
@@ -647,7 +647,6 @@
             .assertStartPositionIsAlmost(0.dp)
     }
 
-    @Ignore("b/266124027")
     @Test
     fun whenItemsBecameEmpty() {
         var items by mutableStateOf((1..10).toList())
@@ -676,9 +675,9 @@
 
         // and has no children
         rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
         rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
@@ -814,6 +813,7 @@
         }
     }
 
+    @Ignore // b/268211857
     @Test
     fun scroll_makeListSmaller_scroll() {
         var items by mutableStateOf((1..100).toList())
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..cb54025 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);
   }
@@ -42,6 +36,37 @@
     property public final int activeSlideIndex;
   }
 
+  @androidx.tv.material3.ExperimentalTvMaterial3Api public final class ClickableSurfaceColor {
+    method public long getDefaultColor();
+    method public long getDisabledColor();
+    method public long getFocusedColor();
+    method public long getPressedColor();
+    property public final long defaultColor;
+    property public final long disabledColor;
+    property public final long focusedColor;
+    property public final long pressedColor;
+  }
+
+  @androidx.tv.material3.ExperimentalTvMaterial3Api public final class ClickableSurfaceDefaults {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ClickableSurfaceColor color(optional long defaultColor, optional long focusedColor, optional long pressedColor, optional long disabledColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ClickableSurfaceColor contentColor(optional long defaultColor, optional long focusedColor, optional long pressedColor, optional long disabledColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ClickableSurfaceShape shape(optional androidx.compose.ui.graphics.Shape defaultShape, optional androidx.compose.ui.graphics.Shape focusedShape, optional androidx.compose.ui.graphics.Shape pressedShape, optional androidx.compose.ui.graphics.Shape disabledShape, optional androidx.compose.ui.graphics.Shape focusedDisabledShape);
+    field public static final androidx.tv.material3.ClickableSurfaceDefaults INSTANCE;
+  }
+
+  @androidx.tv.material3.ExperimentalTvMaterial3Api public final class ClickableSurfaceShape {
+    method public androidx.compose.ui.graphics.Shape getDefaultShape();
+    method public androidx.compose.ui.graphics.Shape getDisabledShape();
+    method public androidx.compose.ui.graphics.Shape getFocusedDisabledShape();
+    method public androidx.compose.ui.graphics.Shape getFocusedShape();
+    method public androidx.compose.ui.graphics.Shape getPressedShape();
+    property public final androidx.compose.ui.graphics.Shape defaultShape;
+    property public final androidx.compose.ui.graphics.Shape disabledShape;
+    property public final androidx.compose.ui.graphics.Shape focusedDisabledShape;
+    property public final androidx.compose.ui.graphics.Shape focusedShape;
+    property public final androidx.compose.ui.graphics.Shape pressedShape;
+  }
+
   @androidx.compose.runtime.Stable @androidx.tv.material3.ExperimentalTvMaterial3Api public final class ColorScheme {
     ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long surfaceTint, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline, long outlineVariant, long scrim);
     method public androidx.tv.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long surfaceTint, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline, optional long outlineVariant, optional long scrim);
@@ -142,9 +167,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,11 +214,8 @@
     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 @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.tv.material3.ClickableSurfaceShape shape, optional androidx.tv.material3.ClickableSurfaceColor color, optional androidx.tv.material3.ClickableSurfaceColor 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();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
   }
@@ -271,8 +290,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/tv/tv-material/src/androidTest/java/androidx/tv/material3/SurfaceTest.kt b/tv/tv-material/src/androidTest/java/androidx/tv/material3/SurfaceTest.kt
index 7ce78931..22dd6ab 100644
--- a/tv/tv-material/src/androidTest/java/androidx/tv/material3/SurfaceTest.kt
+++ b/tv/tv-material/src/androidTest/java/androidx/tv/material3/SurfaceTest.kt
@@ -101,15 +101,23 @@
             ) {
                 Surface(
                     onClick = {},
-                    shape = RectangleShape,
-                    color = Color.Yellow
+                    shape = ClickableSurfaceDefaults.shape(
+                        defaultShape = RectangleShape
+                    ),
+                    color = ClickableSurfaceDefaults.color(
+                        defaultColor = Color.Yellow
+                    )
                 ) {
                     Box(Modifier.fillMaxSize())
                 }
                 Surface(
                     onClick = {},
-                    shape = RectangleShape,
-                    color = Color.Green
+                    shape = ClickableSurfaceDefaults.shape(
+                        defaultShape = RectangleShape
+                    ),
+                    color = ClickableSurfaceDefaults.color(
+                        defaultColor = Color.Green
+                    )
                 ) {
                     Box(Modifier.fillMaxSize())
                 }
@@ -148,7 +156,7 @@
     }
 
     /**
-     * Tests that composed modifiers applied to TvSurface are applied within the changes to
+     * Tests that composed modifiers applied to Surface are applied within the changes to
      * [LocalContentColor], so they can consume the updated values.
      */
     @Test
@@ -164,7 +172,7 @@
                     },
                     onClick = {},
                     tonalElevation = 2.toDp(),
-                    contentColor = expectedColor
+                    contentColor = ClickableSurfaceDefaults.color(defaultColor = expectedColor)
                 ) {}
             }
         }
@@ -175,19 +183,19 @@
     }
 
     @Test
-    fun tvClickableOverload_semantics() {
+    fun clickableOverload_semantics() {
         val count = mutableStateOf(0)
         rule.setContent {
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface"),
+                    .testTag("surface"),
                 onClick = { count.value += 1 }
             ) {
                 Text("${count.value}")
                 Spacer(Modifier.size(30.toDp()))
             }
         }
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .performSemanticsAction(SemanticsActions.RequestFocus)
             .assertHasClickAction()
             .assertIsEnabled()
@@ -198,12 +206,12 @@
     }
 
     @Test
-    fun tvClickableOverload_customSemantics() {
+    fun clickableOverload_customSemantics() {
         val count = mutableStateOf(0)
         rule.setContent {
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface"),
+                    .testTag("surface"),
                 onClick = { count.value += 1 },
                 role = Role.Checkbox
             ) {
@@ -211,7 +219,7 @@
                 Spacer(Modifier.size(30.toDp()))
             }
         }
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .performSemanticsAction(SemanticsActions.RequestFocus)
             .assertHasClickAction()
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
@@ -223,44 +231,44 @@
     }
 
     @Test
-    fun tvClickableOverload_clickAction() {
+    fun clickableOverload_clickAction() {
         val count = mutableStateOf(0)
 
         rule.setContent {
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface"),
+                    .testTag("surface"),
                 onClick = { count.value += 1 }
             ) {
                 Spacer(modifier = Modifier.size(30.toDp()))
             }
         }
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .performSemanticsAction(SemanticsActions.RequestFocus)
             .performKeyInput { pressKey(Key.DirectionCenter) }
         Truth.assertThat(count.value).isEqualTo(1)
 
-        rule.onNodeWithTag("tvSurface").performKeyInput { pressKey(Key.DirectionCenter) }
+        rule.onNodeWithTag("surface").performKeyInput { pressKey(Key.DirectionCenter) }
             .performKeyInput { pressKey(Key.DirectionCenter) }
         Truth.assertThat(count.value).isEqualTo(3)
     }
 
     @Test
-    fun tvSurface_onDisable_clickFails() {
+    fun clickableSurface_onDisable_clickFails() {
         val count = mutableStateOf(0f)
         val enabled = mutableStateOf(true)
 
         rule.setContent {
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface"),
+                    .testTag("surface"),
                 onClick = { count.value += 1 },
                 enabled = enabled.value
             ) {
                 Spacer(Modifier.size(30.toDp()))
             }
         }
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .performSemanticsAction(SemanticsActions.RequestFocus)
             .assertIsEnabled()
             .performKeyInput { pressKey(Key.DirectionCenter) }
@@ -270,7 +278,7 @@
             enabled.value = false
         }
 
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .assertIsNotEnabled()
             .performKeyInput { pressKey(Key.DirectionCenter) }
             .performKeyInput { pressKey(Key.DirectionCenter) }
@@ -278,7 +286,7 @@
     }
 
     @Test
-    fun tvClickableOverload_interactionSource() {
+    fun clickableOverload_interactionSource() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -287,7 +295,7 @@
             scope = rememberCoroutineScope()
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface"),
+                    .testTag("surface"),
                 onClick = {},
                 interactionSource = interactionSource
             ) {
@@ -305,7 +313,7 @@
             Truth.assertThat(interactions).isEmpty()
         }
 
-        rule.onNodeWithTag("tvSurface")
+        rule.onNodeWithTag("surface")
             .performSemanticsAction(SemanticsActions.RequestFocus)
             .performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -314,7 +322,7 @@
             Truth.assertThat(interactions[1]).isInstanceOf(PressInteraction.Press::class.java)
         }
 
-        rule.onNodeWithTag("tvSurface").performKeyInput { keyUp(Key.DirectionCenter) }
+        rule.onNodeWithTag("surface").performKeyInput { keyUp(Key.DirectionCenter) }
 
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(3)
@@ -327,7 +335,7 @@
     }
 
     @Test
-    fun tvSurface_allowsFinalPassChildren() {
+    fun clickableSurface_allowsFinalPassChildren() {
         val hitTested = mutableStateOf(false)
 
         rule.setContent {
@@ -335,7 +343,7 @@
                 Surface(
                     modifier = Modifier
                         .fillMaxSize()
-                        .testTag("tvSurface"),
+                        .testTag("surface"),
                     onClick = {}
                 ) {
                     Box(
@@ -355,7 +363,7 @@
                 }
             }
         }
-        rule.onNodeWithTag("tvSurface").performSemanticsAction(SemanticsActions.RequestFocus)
+        rule.onNodeWithTag("surface").performSemanticsAction(SemanticsActions.RequestFocus)
         rule.onNodeWithTag("pressable", true)
             .performKeyInput { pressKey(Key.DirectionCenter) }
         Truth.assertThat(hitTested.value).isTrue()
@@ -363,7 +371,7 @@
 
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
     @Test
-    fun tvSurface_reactsToStateChange() {
+    fun clickableSurface_reactsToStateChange() {
         val interactionSource = MutableInteractionSource()
         var isPressed by mutableStateOf(false)
 
@@ -371,14 +379,14 @@
             isPressed = interactionSource.collectIsPressedAsState().value
             Surface(
                 modifier = Modifier
-                    .testTag("tvSurface")
+                    .testTag("surface")
                     .size(100.toDp()),
                 onClick = {},
                 interactionSource = interactionSource
             ) {}
         }
 
-        with(rule.onNodeWithTag("tvSurface")) {
+        with(rule.onNodeWithTag("surface")) {
             performSemanticsAction(SemanticsActions.RequestFocus)
             assertIsFocused()
             performKeyInput { keyDown(Key.DirectionCenter) }
diff --git a/tv/tv-material/src/main/java/androidx/tv/material3/Surface.kt b/tv/tv-material/src/main/java/androidx/tv/material3/Surface.kt
index 36e4df2..ffa3dc4 100644
--- a/tv/tv-material/src/main/java/androidx/tv/material3/Surface.kt
+++ b/tv/tv-material/src/main/java/androidx/tv/material3/Surface.kt
@@ -19,11 +19,12 @@
 import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
-import androidx.compose.foundation.clickable
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.interaction.collectIsFocusedAsState
+import androidx.compose.foundation.interaction.collectIsPressedAsState
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
@@ -55,68 +56,32 @@
 import kotlinx.coroutines.launch
 
 /**
- * Material surface is the central metaphor in material design. Each surface exists at a given
- * elevation, which influences how that piece of surface visually relates to other surfaces and how
- * that surface is modified by tonal variance.
+ * The [Surface] is a building block component that will be used for any focusable
+ * element on TV such as buttons, cards, navigation, etc. This clickable Surface is similar to
+ * Compose Material's Surface composable but will have more functionality that will make focus
+ * management easier. [Surface] will automatically apply the relevant modifier(s) based on
+ * the current interaction state.
  *
- * This version of Surface is responsible for a click handling as well as everything else that a
- * regular Surface does:
- *
- * This clickable Surface is responsible for:
- *
- * 1) Clipping: Surface clips its children to the shape specified by [shape]
- *
- * 2) Borders: If [shape] has a border, then it will also be drawn.
- *
- * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
- * [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
- * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
- * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
- * its ancestors, by summing the elevation of all previous Surfaces.
- *
- * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
- * this surface - this is used by the [Text] and Icon components as a default color. If no
- * [contentColor] is set, this surface will try and match its background color to a color defined in
- * the theme [ColorScheme], and return the corresponding content color. For example, if the [color]
- * of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface].
- * If [color] is not part of the theme palette, [contentColor] will keep the same value set above
- * this Surface.
- *
- * 5) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
- * updating the [interactionSource] when [PressInteraction] occurs, and showing ripple indication in
- * response to press events. If you don't need click handling, consider using the Surface function
- * that doesn't require [onClick] param. If you need to set a custom label for the [onClick], apply
- * 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].
- *
- * To manually retrieve the content color inside a surface, use [LocalContentColor].
- *
- * @param onClick callback to be called when the surface is clicked
+ * @param onClick callback to be called when the surface is clicked. Note: DPad Enter button won't
+ * work if this value is null
  * @param modifier Modifier to be applied to the layout corresponding to the surface
- * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
- * clickable
- * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
- * [tonalElevation] is greater than zero.
- * @param color The background color. Use [Color.Transparent] to have no color.
- * @param contentColor The preferred content color provided by this Surface to its children.
- * Defaults to either the matching content color for [color], or if [color] is not a color from the
- * theme, this will keep the same value set above this Surface.
- * @param border Optional border to draw on top of the surface
+ * @param enabled Controls the enabled state of the surface. When `false`, this Surface will not be
+ * clickable or focusable.
  * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
  * in a darker color in light theme and lighter color in dark theme.
- * @param role The type of user interface element. Accessibility services might use this
- * to describe the element or do customizations
  * @param shadowElevation The size of the shadow below the surface. Note that It will not affect z
  * index of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
+ * @param role The type of user interface element. Accessibility services might use this to describe
+ * the element or do customizations.
+ * @param shape Defines the surface's shape.
+ * @param color Color to be used on background of the Surface
+ * @param contentColor The preferred content color provided by this Surface to its children.
+ * @param border Optional border to draw on top of the surface
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
  * for this Surface. You can create and pass in your own remembered [MutableInteractionSource] if
  * you want to observe [Interaction]s and customize the appearance / behavior of this Surface in
  * different [Interaction]s.
- * @param content The content inside this Surface
+ * @param content defines the [Composable] content inside the surface
  */
 @ExperimentalTvMaterial3Api
 @NonRestartableComposable
@@ -125,9 +90,9 @@
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    shape: Shape = RectangleShape,
-    color: Color = MaterialTheme.colorScheme.surface,
-    contentColor: Color = contentColorFor(color),
+    shape: ClickableSurfaceShape = ClickableSurfaceDefaults.shape(),
+    color: ClickableSurfaceColor = ClickableSurfaceDefaults.color(),
+    contentColor: ClickableSurfaceColor = ClickableSurfaceDefaults.contentColor(),
     border: BorderStroke? = null,
     tonalElevation: Dp = 0.dp,
     role: Role? = null,
@@ -135,6 +100,8 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable () -> Unit
 ) {
+    val focused by interactionSource.collectIsFocusedAsState()
+    val pressed by interactionSource.collectIsPressedAsState()
     SurfaceImpl(
         modifier = modifier.tvClickable(
             enabled = enabled,
@@ -142,9 +109,24 @@
             interactionSource = interactionSource,
             role = role
         ),
-        shape = shape,
-        color = color,
-        contentColor = contentColor,
+        shape = ClickableSurfaceDefaults.shape(
+            enabled = enabled,
+            focused = focused,
+            pressed = pressed,
+            shape = shape
+        ),
+        color = ClickableSurfaceDefaults.color(
+            enabled = enabled,
+            focused = focused,
+            pressed = pressed,
+            color = color
+        ),
+        contentColor = ClickableSurfaceDefaults.color(
+            enabled = enabled,
+            focused = focused,
+            pressed = pressed,
+            color = contentColor
+        ),
         tonalElevation = tonalElevation,
         shadowElevation = shadowElevation,
         border = border,
diff --git a/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceDefaults.kt b/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceDefaults.kt
new file mode 100644
index 0000000..38a3b45
--- /dev/null
+++ b/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceDefaults.kt
@@ -0,0 +1,135 @@
+/*
+ * 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.tv.material3
+
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+
+/**
+ * Contains the default values used by clickable Surface.
+ */
+@ExperimentalTvMaterial3Api
+object ClickableSurfaceDefaults {
+    internal fun shape(
+        enabled: Boolean,
+        focused: Boolean,
+        pressed: Boolean,
+        shape: ClickableSurfaceShape
+    ): Shape {
+        return when {
+            pressed && enabled -> shape.pressedShape
+            focused && enabled -> shape.focusedShape
+            focused && !enabled -> shape.focusedDisabledShape
+            enabled -> shape.defaultShape
+            else -> shape.disabledShape
+        }
+    }
+
+    /**
+     * Creates a [ClickableSurfaceShape] that represents the default container shapes used in a
+     * Surface.
+     *
+     * @param defaultShape the shape used when the Surface is enabled, and has no other
+     * [Interaction]s.
+     * @param focusedShape the shape used when the Surface is enabled and focused.
+     * @param pressedShape the shape used when the Surface is enabled pressed.
+     * @param disabledShape the shape used when the Surface is not enabled.
+     * @param focusedDisabledShape the shape used when the Surface is not enabled and focused.
+     */
+    @ReadOnlyComposable
+    @Composable
+    fun shape(
+        defaultShape: Shape = MaterialTheme.shapes.medium,
+        focusedShape: Shape = defaultShape,
+        pressedShape: Shape = defaultShape,
+        disabledShape: Shape = defaultShape,
+        focusedDisabledShape: Shape = disabledShape
+    ) = ClickableSurfaceShape(
+        defaultShape = defaultShape,
+        focusedShape = focusedShape,
+        pressedShape = pressedShape,
+        disabledShape = disabledShape,
+        focusedDisabledShape = focusedDisabledShape
+    )
+
+    internal fun color(
+        enabled: Boolean,
+        focused: Boolean,
+        pressed: Boolean,
+        color: ClickableSurfaceColor
+    ): Color {
+        return when {
+            pressed && enabled -> color.pressedColor
+            focused && enabled -> color.focusedColor
+            enabled -> color.defaultColor
+            else -> color.disabledColor
+        }
+    }
+
+    /**
+     * Creates a [ClickableSurfaceColor] that represents the default container colors used in a
+     * Surface.
+     *
+     * @param defaultColor the container color of this Surface when enabled
+     * @param focusedColor the container color of this Surface when enabled and focused
+     * @param pressedColor the container color of this Surface when enabled and pressed
+     * @param disabledColor the container color of this Surface when not enabled
+     */
+    @ReadOnlyComposable
+    @Composable
+    fun color(
+        defaultColor: Color = MaterialTheme.colorScheme.surface,
+        focusedColor: Color = MaterialTheme.colorScheme.inverseSurface,
+        pressedColor: Color = MaterialTheme.colorScheme.inverseSurface,
+        disabledColor: Color = MaterialTheme.colorScheme.surfaceVariant.copy(
+            alpha = DisabledBackgroundAlpha
+        )
+    ) = ClickableSurfaceColor(
+        defaultColor = defaultColor,
+        focusedColor = focusedColor,
+        pressedColor = pressedColor,
+        disabledColor = disabledColor
+    )
+
+    /**
+     * Creates a [ClickableSurfaceColor] that represents the default content colors used in a
+     * Surface.
+     *
+     * @param defaultColor the content color of this Surface when enabled
+     * @param focusedColor the content color of this Surface when enabled and focused
+     * @param pressedColor the content color of this Surface when enabled and pressed
+     * @param disabledColor the content color of this Surface when not enabled
+     */
+    @ReadOnlyComposable
+    @Composable
+    fun contentColor(
+        defaultColor: Color = MaterialTheme.colorScheme.onSurface,
+        focusedColor: Color = MaterialTheme.colorScheme.inverseOnSurface,
+        pressedColor: Color = MaterialTheme.colorScheme.inverseOnSurface,
+        disabledColor: Color = MaterialTheme.colorScheme.onSurface
+    ) = ClickableSurfaceColor(
+        defaultColor = defaultColor,
+        focusedColor = focusedColor,
+        pressedColor = pressedColor,
+        disabledColor = disabledColor
+    )
+}
+
+private const val DisabledBackgroundAlpha = 0.4f
diff --git a/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceStyles.kt b/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceStyles.kt
new file mode 100644
index 0000000..7d0b3cd
--- /dev/null
+++ b/tv/tv-material/src/main/java/androidx/tv/material3/SurfaceStyles.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.tv.material3
+
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+
+/**
+ * Defines [Shape] for all TV [Interaction] states of a Clickable Surface.
+ * @param defaultShape [Shape] to be applied when Clickable Surface is in the default state.
+ * @param focusedShape [Shape] to be applied when Clickable Surface is focused.
+ * @param pressedShape [Shape] to be applied when Clickable Surface is pressed.
+ * @param disabledShape [Shape] to be applied when Clickable Surface is disabled.
+ * @param focusedDisabledShape [Shape] to be applied when Clickable Surface is focused in the
+ * default state.
+ */
+@ExperimentalTvMaterial3Api
+class ClickableSurfaceShape internal constructor(
+    val defaultShape: Shape,
+    val focusedShape: Shape,
+    val pressedShape: Shape,
+    val disabledShape: Shape,
+    val focusedDisabledShape: Shape
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as ClickableSurfaceShape
+
+        if (defaultShape != other.defaultShape) return false
+        if (focusedShape != other.focusedShape) return false
+        if (pressedShape != other.pressedShape) return false
+        if (disabledShape != other.disabledShape) return false
+        if (focusedDisabledShape != other.focusedDisabledShape) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultShape.hashCode()
+        result = 31 * result + focusedShape.hashCode()
+        result = 31 * result + pressedShape.hashCode()
+        result = 31 * result + disabledShape.hashCode()
+        result = 31 * result + focusedDisabledShape.hashCode()
+
+        return result
+    }
+
+    override fun toString(): String {
+        return "ClickableSurfaceShape(defaultShape=$defaultShape, focusedShape=$focusedShape, " +
+            "pressedShape=$pressedShape, disabledShape=$disabledShape, " +
+            "focusedDisabledShape=$focusedDisabledShape)"
+    }
+}
+
+/**
+ * Defines [Color] for all TV [Interaction] states of a Clickable Surface.
+ * @param defaultColor [Color] to be applied when Clickable Surface is in the default state.
+ * @param focusedColor [Color] to be applied when Clickable Surface is focused.
+ * @param pressedColor [Color] to be applied when Clickable Surface is pressed.
+ * @param disabledColor [Color] to be applied when Clickable Surface is disabled.
+ */
+@ExperimentalTvMaterial3Api
+class ClickableSurfaceColor internal constructor(
+    val defaultColor: Color,
+    val focusedColor: Color,
+    val pressedColor: Color,
+    val disabledColor: Color
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as ClickableSurfaceColor
+
+        if (defaultColor != other.defaultColor) return false
+        if (focusedColor != other.focusedColor) return false
+        if (pressedColor != other.pressedColor) return false
+        if (disabledColor != other.disabledColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = defaultColor.hashCode()
+        result = 31 * result + focusedColor.hashCode()
+        result = 31 * result + pressedColor.hashCode()
+        result = 31 * result + disabledColor.hashCode()
+
+        return result
+    }
+
+    override fun toString(): String {
+        return "ClickableSurfaceColor(defaultColor=$defaultColor, focusedColor=$focusedColor, " +
+            "pressedColor=$pressedColor, disabledColor=$disabledColor)"
+    }
+}
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-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..7a338f6 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();
@@ -289,7 +280,7 @@
   }
 
   public final class PickerGroupKt {
-    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
+    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional boolean propagateMinConstraints, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
     method @androidx.compose.runtime.Composable public static androidx.wear.compose.material.PickerGroupState rememberPickerGroupState(optional int initiallySelectedIndex);
   }
 
@@ -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..0c19e30 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();
@@ -305,7 +296,7 @@
   }
 
   public final class PickerGroupKt {
-    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
+    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional boolean propagateMinConstraints, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
     method @androidx.compose.runtime.Composable public static androidx.wear.compose.material.PickerGroupState rememberPickerGroupState(optional int initiallySelectedIndex);
   }
 
@@ -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..7a338f6 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();
@@ -289,7 +280,7 @@
   }
 
   public final class PickerGroupKt {
-    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
+    method @androidx.compose.runtime.Composable public static void PickerGroup(androidx.wear.compose.material.PickerGroupItem![] pickers, optional androidx.compose.ui.Modifier modifier, optional androidx.wear.compose.material.PickerGroupState pickerGroupState, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onSelected, optional boolean autoCenter, optional boolean propagateMinConstraints, optional androidx.wear.compose.material.TouchExplorationStateProvider touchExplorationStateProvider, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? separator);
     method @androidx.compose.runtime.Composable public static androidx.wear.compose.material.PickerGroupState rememberPickerGroupState(optional int initiallySelectedIndex);
   }
 
@@ -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/build.gradle b/wear/compose/compose-material/samples/build.gradle
index fc8c8f3..4eddd5f 100644
--- a/wear/compose/compose-material/samples/build.gradle
+++ b/wear/compose/compose-material/samples/build.gradle
@@ -60,3 +60,13 @@
     inceptionYear = "2021"
     description = "Contains the sample code for the Android Wear Compose Material Classes"
 }
+
+// Workaround for https://github.com/gradle/gradle/issues/19882
+configurations.all {
+    resolutionStrategy.dependencySubstitution {
+        substitute(module("androidx.lifecycle:lifecycle-viewmodel-ktx:")).
+                using project(":lifecycle:lifecycle-viewmodel-ktx")
+        substitute(module("androidx.lifecycle:lifecycle-runtime-ktx:")).
+                using project(":lifecycle:lifecycle-runtime-ktx")
+    }
+}
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/HorizontalPageIndicator.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/HorizontalPageIndicator.kt
index f73c371..08dd5cc 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/HorizontalPageIndicator.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/HorizontalPageIndicator.kt
@@ -272,9 +272,7 @@
         modifier = modifier,
         // 90 degrees equals to 6 o'clock position, at the bottom of the screen
         anchor = 90f,
-        // Since Swipe to dismiss is always LtR, we want to follow the same direction when
-        // navigating amongst pages, so the first page is always on the left.
-        angularDirection = CurvedDirection.Angular.CounterClockwise
+        angularDirection = CurvedDirection.Angular.Reversed
     ) {
         // drawing 1 extra spacer for transition
         curvedComposable {
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/PickerGroup.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
index a6f1306..845c4685 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
@@ -37,6 +37,7 @@
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.ParentDataModifier
 import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.wear.compose.foundation.HierarchicalFocusCoordinator
 import androidx.wear.compose.foundation.rememberActiveFocusRequester
@@ -64,6 +65,7 @@
  * recommended to set this as true when all the pickers cannot be fit into the screen. Or provide a
  * mechanism to navigate to pickers which are not visible on screen. If false, the whole row
  * containing pickers would be centered.
+ * @param propagateMinConstraints Whether the incoming min constraints should be passed to content.
  * @param touchExplorationStateProvider A [TouchExplorationStateProvider] to provide the current
  * state of touch exploration service. This will be used to determine how the PickerGroup and
  * talkback focus behaves/reacts to click and scroll events.
@@ -78,18 +80,21 @@
     pickerGroupState: PickerGroupState = rememberPickerGroupState(),
     onSelected: (selectedIndex: Int) -> Unit = {},
     autoCenter: Boolean = true,
+    propagateMinConstraints: Boolean = false,
     touchExplorationStateProvider: TouchExplorationStateProvider =
         DefaultTouchExplorationStateProvider(),
     separator: (@Composable (Int) -> Unit)? = null
 ) {
     val touchExplorationServicesEnabled by touchExplorationStateProvider.touchExplorationState()
+
     AutoCenteringRow(
         modifier = modifier
             .then(
                 // When touch exploration services are enabled, send the scroll events on the parent
                 // composable to selected picker
                 if (touchExplorationServicesEnabled &&
-                    pickerGroupState.selectedIndex in pickers.indices) {
+                    pickerGroupState.selectedIndex in pickers.indices
+                ) {
                     Modifier.scrollablePicker(
                         pickers[pickerGroupState.selectedIndex].pickerState
                     )
@@ -97,6 +102,7 @@
                     Modifier
                 }
             ),
+        propagateMinConstraints = propagateMinConstraints
     ) {
         pickers.forEachIndexed { index, pickerData ->
             val pickerSelected = index == pickerGroupState.selectedIndex
@@ -235,17 +241,23 @@
 @Composable
 private fun AutoCenteringRow(
     modifier: Modifier = Modifier,
+    propagateMinConstraints: Boolean,
     content: @Composable () -> Unit
 ) {
-    Layout(modifier = modifier, content = content) { measurables, constraints ->
+    Layout(modifier = modifier, content = content) { measurables, parentConstraints ->
+        // Reset the min width and height of the constraints used to measure child composables
+        // if min constraints are not supposed to propagated.
+        val constraints = if (propagateMinConstraints) {
+            parentConstraints
+        } else {
+            parentConstraints.copy(minWidth = 0, minHeight = 0)
+        }
         val placeables = measurables.map { it.measure(constraints) }
         val centeringOffset = computeCenteringOffset(placeables)
         val rowWidth =
             if (constraints.hasBoundedWidth) constraints.maxWidth
             else constraints.minWidth
-        val rowHeight =
-            if (constraints.hasBoundedHeight) constraints.maxHeight
-            else constraints.minHeight
+        val rowHeight = calculateHeight(constraints, placeables)
         layout(width = rowWidth, height = rowHeight) {
             var x = rowWidth / 2f - centeringOffset
             placeables.forEach {
@@ -290,6 +302,16 @@
     return sumWidth / 2
 }
 
+/**
+ * Calculates the height of the [AutoCenteringRow] from the given [Placeable]s and [Constraints]. It
+ * is calculated based on the max height of all the [Placeable]s and the height passed from the
+ * [Constraints].
+ */
+private fun calculateHeight(constraints: Constraints, placeables: List<Placeable>): Int {
+    val maxChildrenHeight = placeables.maxOf { it.height }
+    return maxChildrenHeight.coerceIn(constraints.minHeight, constraints.maxHeight)
+}
+
 @Suppress("ModifierInspectorInfo")
 internal fun Modifier.autoCenteringTarget() = this.then(
     object : ParentDataModifier {
diff --git a/wear/compose/compose-material3/samples/build.gradle b/wear/compose/compose-material3/samples/build.gradle
index 8f54238..10c22e1 100644
--- a/wear/compose/compose-material3/samples/build.gradle
+++ b/wear/compose/compose-material3/samples/build.gradle
@@ -59,3 +59,13 @@
     inceptionYear = "2022"
     description = "Contains the sample code for the Android Wear Compose Material 3 Classes"
 }
+
+// Workaround for https://github.com/gradle/gradle/issues/19882
+configurations.all {
+    resolutionStrategy.dependencySubstitution {
+        substitute(module("androidx.lifecycle:lifecycle-viewmodel-ktx:")).
+                using project(":lifecycle:lifecycle-viewmodel-ktx")
+        substitute(module("androidx.lifecycle:lifecycle-runtime-ktx:")).
+                using project(":lifecycle:lifecycle-runtime-ktx")
+    }
+}
diff --git a/wear/compose/compose-navigation/build.gradle b/wear/compose/compose-navigation/build.gradle
index 0cfac0c..0f056c9 100644
--- a/wear/compose/compose-navigation/build.gradle
+++ b/wear/compose/compose-navigation/build.gradle
@@ -45,6 +45,7 @@
     androidTestImplementation(project(":wear:compose:compose-navigation-samples"))
     androidTestImplementation(libs.truth)
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.5.1")
+    androidTestImplementation("androidx.navigation:navigation-testing:2.5.3")
 
     samples(project(":wear:compose:compose-navigation-samples"))
 }
diff --git a/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt b/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
index 4ad9e64..68f68b5 100644
--- a/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
+++ b/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
@@ -34,6 +34,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
@@ -49,6 +50,7 @@
 import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavHostController
+import androidx.navigation.testing.TestNavHostController
 import androidx.wear.compose.material.Button
 import androidx.wear.compose.material.CompactChip
 import androidx.wear.compose.material.MaterialTheme
@@ -390,6 +392,35 @@
         }
     }
 
+    @Test
+    fun testNavHostController_starts_at_default_destination() {
+        lateinit var navController: TestNavHostController
+
+        rule.setContentWithTheme {
+            navController = TestNavHostController(LocalContext.current)
+            navController.navigatorProvider.addNavigator(WearNavigator())
+
+            SwipeDismissWithNavigation(navController)
+        }
+
+        rule.onNodeWithText(START).assertExists()
+    }
+
+    @Test
+    fun testNavHostController_sets_current_destination() {
+        lateinit var navController: TestNavHostController
+
+        rule.setContentWithTheme {
+            navController = TestNavHostController(LocalContext.current)
+            navController.navigatorProvider.addNavigator(WearNavigator())
+
+            SwipeDismissWithNavigation(navController)
+            navController.setCurrentDestination(NEXT)
+        }
+
+        rule.onNodeWithText(NEXT).assertExists()
+    }
+
     @Composable
     fun SwipeDismissWithNavigation(
         navController: NavHostController = rememberSwipeDismissableNavController()
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..def1922 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
@@ -135,9 +135,9 @@
         // When the time picker loads, none of the individual pickers are selected in talkback mode,
         // otherwise hours picker should be focused.
         val pickerGroupState = if (touchExplorationServicesEnabled) {
-            rememberPickerGroupState(-1)
+            rememberPickerGroupState(FocusableElementsTimePicker.NONE.index)
         } else {
-            rememberPickerGroupState(0)
+            rememberPickerGroupState(FocusableElementsTimePicker.HOURS.index)
         }
         val textStyle = MaterialTheme.typography.display3
         val optionColor = MaterialTheme.colors.secondary
@@ -159,13 +159,14 @@
                 createDescription(pickerGroupState, secondState.selectedOption, "seconds")
             }
         }
-        val onPickerSelected = { selectedPicker: Int ->
-            if (pickerGroupState.selectedIndex != selectedPicker) {
-                pickerGroupState.selectedIndex = selectedPicker
-            } else if (selectedPicker > 2) {
+        val onPickerSelected = { curr: FocusableElementsTimePicker,
+            next: FocusableElementsTimePicker ->
+            if (pickerGroupState.selectedIndex != curr.index) {
+                pickerGroupState.selectedIndex = curr.index
+            } else if (next == FocusableElementsTimePicker.CONFIRM_BUTTON) {
                 focusRequesterConfirmButton.requestFocus()
             } else {
-                pickerGroupState.selectedIndex += 1
+                pickerGroupState.selectedIndex = next.index
             }
         }
 
@@ -176,10 +177,10 @@
             ) {
                 Spacer(Modifier.height(12.dp))
                 Text(
-                    text = when (pickerGroupState.selectedIndex) {
-                        0 -> "Hour"
-                        1 -> "Minute"
-                        2 -> "Second"
+                    text = when (FocusableElementsTimePicker[pickerGroupState.selectedIndex]) {
+                        FocusableElementsTimePicker.HOURS -> "Hour"
+                        FocusableElementsTimePicker.MINUTES -> "Minute"
+                        FocusableElementsTimePicker.SECONDS -> "Second"
                         else -> ""
                     },
                     color = optionColor,
@@ -202,7 +203,12 @@
                             pickerState = hourState,
                             modifier = Modifier.size(40.dp, 100.dp),
                             focusRequester = remember { FocusRequester() },
-                            onSelected = { onPickerSelected(0) },
+                            onSelected = {
+                                onPickerSelected(
+                                    FocusableElementsTimePicker.HOURS,
+                                    FocusableElementsTimePicker.MINUTES
+                                )
+                            },
                             contentDescription = hourContentDescription,
                             option = pickerOption
                         ),
@@ -210,7 +216,12 @@
                             pickerState = minuteState,
                             modifier = Modifier.size(40.dp, 100.dp),
                             focusRequester = remember { FocusRequester() },
-                            onSelected = { onPickerSelected(1) },
+                            onSelected = {
+                                onPickerSelected(
+                                    FocusableElementsTimePicker.MINUTES,
+                                    FocusableElementsTimePicker.SECONDS
+                                )
+                            },
                             contentDescription = minuteContentDescription,
                             option = pickerOption
                         ),
@@ -218,7 +229,12 @@
                             pickerState = secondState,
                             modifier = Modifier.size(40.dp, 100.dp),
                             focusRequester = remember { FocusRequester() },
-                            onSelected = { onPickerSelected(2) },
+                            onSelected = {
+                                onPickerSelected(
+                                    FocusableElementsTimePicker.SECONDS,
+                                    FocusableElementsTimePicker.CONFIRM_BUTTON
+                                )
+                            },
                             contentDescription = secondContentDescription,
                             option = pickerOption
                         ),
@@ -304,23 +320,21 @@
         .touchExplorationState()
 
     MaterialTheme(typography = typography) {
-        var focusedElement by remember {
-            mutableStateOf(
-                if (touchExplorationServicesEnabled) FocusableElement12Hour.NONE
-                else FocusableElement12Hour.HOURS
-            )
-        }
+        val pickerGroupState =
+            if (touchExplorationServicesEnabled) {
+                rememberPickerGroupState(FocusableElement12Hour.NONE.index)
+            } else {
+                rememberPickerGroupState(FocusableElement12Hour.HOURS.index)
+            }
         val textStyle = MaterialTheme.typography.display3
-        val focusRequesterHours = remember { FocusRequester() }
-        val focusRequesterMinutes = remember { FocusRequester() }
-        val focusRequesterPeriod = remember { FocusRequester() }
+        val pickerOption = pickerTextOption(textStyle) { "%02d".format(it) }
         val focusRequesterConfirmButton = remember { FocusRequester() }
 
         val hoursContentDescription by remember { derivedStateOf {
-                createDescription12Hour(focusedElement, hourState.selectedOption + 1, "hours")
+                createDescription12Hour(pickerGroupState, hourState.selectedOption + 1, "hours")
             } }
         val minutesContentDescription by remember { derivedStateOf {
-                createDescription12Hour(focusedElement, minuteState.selectedOption, "minutes")
+                createDescription12Hour(pickerGroupState, minuteState.selectedOption, "minutes")
             } }
 
         val amString = remember {
@@ -330,28 +344,13 @@
             LocalTime.of(18, 0).format(DateTimeFormatter.ofPattern("a"))
         }
         val periodContentDescription by remember { derivedStateOf {
-                if (focusedElement == FocusableElement12Hour.NONE)
-                    createDescription12Hour(focusedElement, periodState.selectedOption, "period")
+                if (pickerGroupState.selectedIndex == FocusableElement12Hour.NONE.index)
+                    createDescription12Hour(pickerGroupState, periodState.selectedOption, "period")
                 else if (periodState.selectedOption == 0)
-                    createDescription12Hour(focusedElement, periodState.selectedOption, amString)
-                else createDescription12Hour(focusedElement, periodState.selectedOption, pmString)
+                    createDescription12Hour(pickerGroupState, periodState.selectedOption, amString)
+                else createDescription12Hour(pickerGroupState, periodState.selectedOption, pmString)
             } }
-        Box(
-            modifier = modifier
-                .fillMaxSize()
-                .then(
-                    if (touchExplorationServicesEnabled) {
-                        when (focusedElement) {
-                            FocusableElement12Hour.HOURS -> Modifier.scrollablePicker(hourState)
-                            FocusableElement12Hour.MINUTES -> Modifier.scrollablePicker(minuteState)
-                            FocusableElement12Hour.PERIOD -> Modifier.scrollablePicker(periodState)
-                            else -> Modifier
-                        }
-                    } else {
-                        Modifier
-                    }
-                )
-        ) {
+        Box(modifier = modifier.fillMaxSize()) {
             Column(
                 modifier = modifier.fillMaxSize(),
                 verticalArrangement = Arrangement.Center,
@@ -359,7 +358,7 @@
             ) {
                 Spacer(Modifier.height(12.dp))
                 Text(
-                    text = when (focusedElement) {
+                    text = when (FocusableElement12Hour[pickerGroupState.selectedIndex]) {
                         FocusableElement12Hour.HOURS -> "Hour"
                         FocusableElement12Hour.MINUTES -> "Minute"
                         else -> ""
@@ -368,10 +367,11 @@
                     style = MaterialTheme.typography.button,
                     maxLines = 1,
                 )
+                val weightsToCenterVertically = 0.5f
                 Spacer(
                     Modifier
                         .fillMaxWidth()
-                        .weight(0.5f)
+                        .weight(weightsToCenterVertically)
                 )
                 Row(
                     modifier = Modifier.fillMaxWidth(),
@@ -380,104 +380,79 @@
 
                     ) {
                     val doubleTapToNext =
-                        { position: FocusableElement12Hour, next: FocusableElement12Hour ->
-                            focusedElement = when (focusedElement) {
-                                position -> next
-                                else -> position
+                        { current: FocusableElement12Hour, next: FocusableElement12Hour ->
+                            if (pickerGroupState.selectedIndex != current.index) {
+                                focusRequesterConfirmButton.requestFocus()
+                            } else if (next == FocusableElement12Hour.CONFIRM_BUTTON) {
+                                pickerGroupState.selectedIndex = current.index
+                            } else {
+                                pickerGroupState.selectedIndex = next.index
                             }
                         }
-                    Spacer(Modifier.width(8.dp))
-                    PickerWithRSB(
-                        readOnly = focusedElement != FocusableElement12Hour.HOURS,
-                        state = hourState,
-                        focusRequester = focusRequesterHours,
-                        modifier = Modifier.size(48.dp, 100.dp),
-                        onSelected = {
-                            doubleTapToNext(
-                                FocusableElement12Hour.HOURS,
-                                FocusableElement12Hour.MINUTES
-                            )
-                        },
-                        contentDescription = hoursContentDescription,
-                        userScrollEnabled = !touchExplorationServicesEnabled ||
-                            focusedElement == FocusableElement12Hour.HOURS
-                    ) { hour: Int ->
-                        TimePiece(
-                            selected = focusedElement == FocusableElement12Hour.HOURS,
+                    PickerGroup(
+                        PickerGroupItem(
+                            pickerState = hourState,
+                            modifier = Modifier.size(40.dp, 100.dp),
+                            focusRequester = remember { FocusRequester() },
                             onSelected = {
                                 doubleTapToNext(
                                     FocusableElement12Hour.HOURS,
                                     FocusableElement12Hour.MINUTES
                                 )
                             },
-                            text = "%02d".format(hour + 1),
-                            style = textStyle,
-                            touchExplorationServicesEnabled = touchExplorationServicesEnabled
-                        )
-                    }
-                    Separator(2.dp, textStyle)
-                    PickerWithRSB(
-                        readOnly = focusedElement != FocusableElement12Hour.MINUTES,
-                        state = minuteState,
-                        focusRequester = focusRequesterMinutes,
-                        modifier = Modifier.size(48.dp, 100.dp),
-                        onSelected = {
-                            doubleTapToNext(
-                                FocusableElement12Hour.MINUTES,
-                                FocusableElement12Hour.PERIOD
-                            )
-                        },
-                        contentDescription = minutesContentDescription,
-                        userScrollEnabled = !touchExplorationServicesEnabled ||
-                            focusedElement == FocusableElement12Hour.MINUTES
-                    ) { minute: Int ->
-                        TimePiece(
-                            selected = focusedElement == FocusableElement12Hour.MINUTES,
+                            contentDescription = hoursContentDescription,
+                            option = pickerOption
+                        ),
+                        PickerGroupItem(
+                            pickerState = minuteState,
+                            modifier = Modifier.size(48.dp, 100.dp),
+                            focusRequester = remember { FocusRequester() },
+
                             onSelected = {
                                 doubleTapToNext(
                                     FocusableElement12Hour.MINUTES,
                                     FocusableElement12Hour.PERIOD
                                 )
                             },
-                            text = "%02d".format(minute),
-                            style = textStyle,
-                            touchExplorationServicesEnabled = touchExplorationServicesEnabled
-                        )
-                    }
-                    Spacer(Modifier.width(6.dp))
-                    PickerWithRSB(
-                        readOnly = focusedElement != FocusableElement12Hour.PERIOD,
-                        state = periodState,
-                        focusRequester = focusRequesterPeriod,
-                        modifier = Modifier.size(64.dp, 100.dp),
-                        onSelected = {
-                            doubleTapToNext(
-                                FocusableElement12Hour.PERIOD,
-                                FocusableElement12Hour.CONFIRM_BUTTON
-                            )
-                        },
-                        contentDescription = periodContentDescription,
-                        userScrollEnabled = !touchExplorationServicesEnabled ||
-                            focusedElement == FocusableElement12Hour.PERIOD
-                    ) { period: Int ->
-                        TimePiece(
-                            selected = focusedElement == FocusableElement12Hour.PERIOD,
+                            contentDescription = minutesContentDescription,
+                            option = pickerOption
+                        ),
+                        PickerGroupItem(
+                            pickerState = periodState,
+                            modifier = Modifier.size(64.dp, 100.dp),
+                            focusRequester = remember { FocusRequester() },
+                            contentDescription = periodContentDescription,
                             onSelected = {
                                 doubleTapToNext(
                                     FocusableElement12Hour.PERIOD,
                                     FocusableElement12Hour.CONFIRM_BUTTON
                                 )
                             },
-                            text = if (period == 0) amString else pmString,
-                            style = textStyle,
-                            touchExplorationServicesEnabled = touchExplorationServicesEnabled
-                        )
-                    }
+                            option = { optionIndex: Int, pickerSelected: Boolean ->
+                                Box(modifier = Modifier.fillMaxSize()) {
+                                    Text(
+                                        text = if (optionIndex == 0) amString else pmString,
+                                        maxLines = 1,
+                                        style = textStyle,
+                                        color =
+                                        if (pickerSelected) MaterialTheme.colors.secondary
+                                        else MaterialTheme.colors.onBackground,
+                                        modifier = Modifier
+                                            .align(Alignment.Center)
+                                            .wrapContentSize()
+                                    )
+                                }
+                            }
+                        ),
+                        autoCenter = false,
+                        pickerGroupState = pickerGroupState,
+                        separator = { Separator(6.dp, textStyle) },
+                    )
                 }
                 Spacer(
                     Modifier
                         .fillMaxWidth()
-                        .weight(0.5f)
+                        .weight(weightsToCenterVertically)
                 )
                 Button(onClick = {
                     val confirmedTime = LocalTime.of(
@@ -489,7 +464,8 @@
                 },
                     modifier = Modifier
                         .semantics {
-                            focused = focusedElement == FocusableElement12Hour.CONFIRM_BUTTON
+                            focused = pickerGroupState.selectedIndex ==
+                                FocusableElement12Hour.CONFIRM_BUTTON.index
                         }
                         .focusRequester(focusRequesterConfirmButton)
 
@@ -503,14 +479,6 @@
                     )
                 }
                 Spacer(Modifier.height(8.dp))
-                LaunchedEffect(focusedElement) {
-                    if (focusedElement != FocusableElement12Hour.NONE) {
-                        listOf(
-                            focusRequesterHours, focusRequesterMinutes, focusRequesterPeriod,
-                            focusRequesterConfirmButton
-                        )[focusedElement.index].requestFocus()
-                    }
-                }
             }
         }
     }
@@ -583,6 +551,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 +566,8 @@
                     datePickerState.currentYear(),
                     "${datePickerState.currentYear()}"
                 )
-            } }
+            }
+        }
         val monthContentDescription by remember(focusedElement, datePickerState.currentMonth()) {
             derivedStateOf {
                 createDescriptionDatePicker(
@@ -781,14 +753,6 @@
                 }
                 Spacer(Modifier.height(12.dp))
             }
-            LaunchedEffect(focusedElement) {
-                if (focusedElement != FocusableElementDatePicker.NONE) {
-                    listOf(
-                        focusRequesterDay, focusRequesterMonth, focusRequesterYear,
-                        focusRequesterConfirmButton
-                    )[focusedElement.index].requestFocus()
-                }
-            }
         }
     }
 }
@@ -824,6 +788,8 @@
     }
 }
 
+// This is a demo file, suppressing the annotation group error.
+@SuppressLint("NullAnnotationGroup")
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 internal fun TimePiece(
@@ -955,21 +921,21 @@
     label: String
 ): String {
     return when (pickerGroupState.selectedIndex) {
-        -1 -> label
+        FocusableElementsTimePicker.NONE.index -> label
         else -> "$selectedValue" + label
     }
 }
 
 private fun createDescription12Hour(
-    focusedElement: FocusableElement12Hour,
+    pickerGroupState: PickerGroupState,
     selectedValue: Int,
     label: String
 ): String {
-    return when (focusedElement) {
-        FocusableElement12Hour.HOURS -> {
+    return when (pickerGroupState.selectedIndex) {
+        FocusableElement12Hour.HOURS.index -> {
             "$selectedValue" + label
         }
-        FocusableElement12Hour.MINUTES -> {
+        FocusableElement12Hour.MINUTES.index -> {
             "$selectedValue" + label
         }
         else -> label
@@ -1157,12 +1123,29 @@
     }
 }
 
+enum class FocusableElementsTimePicker(val index: Int) {
+    HOURS(0),
+    MINUTES(1),
+    SECONDS(2),
+    CONFIRM_BUTTON(3),
+    NONE(-1);
+
+    companion object {
+        private val map = FocusableElementsTimePicker.values().associateBy { it.index }
+        operator fun get(value: Int) = map[value]
+    }
+}
+
 enum class FocusableElement12Hour(val index: Int) {
     HOURS(0),
     MINUTES(1),
     PERIOD(2),
     CONFIRM_BUTTON(3),
-    NONE(-1)
+    NONE(-1);
+    companion object {
+        private val map = FocusableElement12Hour.values().associateBy { it.index }
+        operator fun get(value: Int) = map[value]
+    }
 }
 
 enum class FocusableElementDatePicker(val index: Int) {
@@ -1170,5 +1153,9 @@
     MONTH(1),
     YEAR(2),
     CONFIRM_BUTTON(3),
-    NONE(-1)
+    NONE(-1);
+    companion object {
+        private val map = FocusableElementDatePicker.values().associateBy { it.index }
+        operator fun get(value: Int) = map[value]
+    }
 }
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 6f6c05a..5cd07fa 100644
--- a/wear/protolayout/protolayout-expression-pipeline/api/current.txt
+++ b/wear/protolayout/protolayout-expression-pipeline/api/current.txt
@@ -12,6 +12,8 @@
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Float!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Duration!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Instant!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Boolean!>);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void close();
     method @UiThread public void disablePlatformDataSources();
@@ -42,7 +44,7 @@
     method @UiThread public void registerSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void registerSensorGatewayConsumer(java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void unregisterSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
+    field @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
     field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final int SENSOR_DATA_TYPE_HEART_RATE = 0; // 0x0
     field public static final int SENSOR_DATA_TYPE_INVALID = -1; // 0xffffffff
   }
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 6f6c05a..5cd07fa 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
@@ -12,6 +12,8 @@
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Float!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Duration!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Instant!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Boolean!>);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void close();
     method @UiThread public void disablePlatformDataSources();
@@ -42,7 +44,7 @@
     method @UiThread public void registerSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void registerSensorGatewayConsumer(java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void unregisterSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
+    field @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
     field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final int SENSOR_DATA_TYPE_HEART_RATE = 0; // 0x0
     field public static final int SENSOR_DATA_TYPE_INVALID = -1; // 0xffffffff
   }
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt b/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
index 25399f3..3a48704 100644
--- a/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
+++ b/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
@@ -12,6 +12,8 @@
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Float!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicColor, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Integer!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Duration!>);
+    method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.time.Instant!>);
     method public androidx.wear.protolayout.expression.pipeline.BoundDynamicType bind(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool, androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver<java.lang.Boolean!>);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void close();
     method @UiThread public void disablePlatformDataSources();
@@ -46,7 +48,7 @@
     method @UiThread public void registerSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void registerSensorGatewayConsumer(java.util.concurrent.Executor, androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
     method @UiThread public void unregisterSensorGatewayConsumer(androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.Consumer);
-    field @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
+    field @RequiresApi(android.os.Build.VERSION_CODES.Q) @RequiresPermission(android.Manifest.permission.ACTIVITY_RECOGNITION) public static final int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1; // 0x1
     field @RequiresPermission(android.Manifest.permission.BODY_SENSORS) public static final int SENSOR_DATA_TYPE_HEART_RATE = 0; // 0x0
     field public static final int SENSOR_DATA_TYPE_INVALID = -1; // 0xffffffff
   }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ColorNodes.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ColorNodes.java
index 54cbc77..1ef366a 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ColorNodes.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ColorNodes.java
@@ -101,7 +101,7 @@
                     ValueAnimator.ofArgb(mProtoNode.getFromArgb(), mProtoNode.getToArgb());
             animator.addUpdateListener(a -> mDownstream.onData((Integer) a.getAnimatedValue()));
 
-            applyAnimationSpecToAnimator(animator, mProtoNode.getSpec());
+            applyAnimationSpecToAnimator(animator, mProtoNode.getAnimationSpec());
 
             mQuotaAwareAnimator.updateAnimator(animator);
             startOrSkipAnimator();
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DurationNodes.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DurationNodes.java
new file mode 100644
index 0000000..3813bd8
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DurationNodes.java
@@ -0,0 +1,33 @@
+/*
+ * 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 java.time.Duration;
+import java.time.Instant;
+
+/** Dynamic data nodes which yield durations. */
+class DurationNodes {
+    private DurationNodes() {}
+
+    /** Dynamic duration node that gets the duration between two time instants. */
+    static class BetweenInstancesNode
+            extends DynamicDataBiTransformNode<Instant, Instant, Duration> {
+
+        BetweenInstancesNode(DynamicTypeValueReceiver<Duration> downstream) {
+            super(downstream, Duration::between);
+        }
+    }
+}
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 32cca2b..2080180 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
@@ -37,18 +37,23 @@
 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.pipeline.DurationNodes.BetweenInstancesNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.AnimatableFixedFloatNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.ArithmeticFloatNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.DynamicAnimatedFloatNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.FixedFloatNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.Int32ToFloatNode;
 import androidx.wear.protolayout.expression.pipeline.FloatNodes.StateFloatNode;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.AnimatableFixedInt32Node;
+import androidx.wear.protolayout.expression.pipeline.InstantNodes.FixedInstantNode;
+import androidx.wear.protolayout.expression.pipeline.InstantNodes.PlatformTimeSourceNode;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.ArithmeticInt32Node;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.DynamicAnimatedInt32Node;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.FixedInt32Node;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.FloatToInt32Node;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.GetDurationPartOpNode;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.PlatformInt32SourceNode;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.StateInt32SourceNode;
-import androidx.wear.protolayout.expression.pipeline.PlatformDataSources.EpochTimePlatformDataSource;
 import androidx.wear.protolayout.expression.pipeline.PlatformDataSources.SensorGatewayPlatformDataSource;
 import androidx.wear.protolayout.expression.pipeline.StringNodes.FixedStringNode;
 import androidx.wear.protolayout.expression.pipeline.StringNodes.FloatFormatNode;
@@ -58,17 +63,23 @@
 import androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway;
 import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableDynamicColor;
 import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableDynamicFloat;
+import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableDynamicInt32;
 import androidx.wear.protolayout.expression.proto.DynamicProto.ConditionalFloatOp;
 import androidx.wear.protolayout.expression.proto.DynamicProto.ConditionalInt32Op;
 import androidx.wear.protolayout.expression.proto.DynamicProto.ConditionalStringOp;
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicBool;
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicColor;
+import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicDuration;
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicFloat;
+import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicInstant;
 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 androidx.wear.protolayout.expression.proto.FixedProto.FixedInt32;
 
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -272,12 +283,6 @@
      * Adds dynamic type from the given {@link DynamicBuilders.DynamicString} for evaluation.
      * Evaluation will start immediately.
      *
-     * <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 stringSource The given String dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
      *     UI thread.
@@ -299,10 +304,6 @@
      *
      * <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 stringSource The given String dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
      *     UI thread.
@@ -325,12 +326,6 @@
      * Adds dynamic type from the given {@link DynamicBuilders.DynamicInt32} for evaluation.
      * Evaluation will start immediately.
      *
-     * <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 int32Source The given integer dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
      *     UI thread.
@@ -340,7 +335,8 @@
             @NonNull DynamicBuilders.DynamicInt32 int32Source,
             @NonNull DynamicTypeValueReceiver<Integer> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(int32Source.toDynamicInt32Proto(), consumer, resultBuilder);
+        bindRecursively(
+                int32Source.toDynamicInt32Proto(), consumer, resultBuilder, Optional.empty());
         mUiHandler.post(() -> processBindings(resultBuilder));
         return new BoundDynamicTypeImpl(resultBuilder);
     }
@@ -350,10 +346,6 @@
      *
      * <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 int32Source The given integer dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
      *     UI thread.
@@ -365,7 +357,29 @@
             @NonNull DynamicInt32 int32Source,
             @NonNull DynamicTypeValueReceiver<Integer> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(int32Source, consumer, resultBuilder);
+        bindRecursively(int32Source, consumer, resultBuilder, Optional.empty());
+        mDynamicTypeNodes.addAll(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds pending expression from the given {@link DynamicInt32} for future evaluation.
+     *
+     * @param int32Source The given integer 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 DynamicInt32} is animatable
+     *     and animations are disabled.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public BoundDynamicType bind(
+            @NonNull DynamicInt32 int32Source,
+            @NonNull DynamicTypeValueReceiver<Integer> consumer,
+            int animationFallbackValue) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(int32Source, consumer, resultBuilder, Optional.of(animationFallbackValue));
         mDynamicTypeNodes.addAll(resultBuilder);
         return new BoundDynamicTypeImpl(resultBuilder);
     }
@@ -374,12 +388,6 @@
      * Adds dynamic type from the given {@link DynamicBuilders.DynamicFloat} for evaluation.
      * Evaluation will start immediately.
      *
-     * <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.
@@ -400,10 +408,6 @@
      *
      * <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.
@@ -428,10 +432,6 @@
      *
      * <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.
@@ -451,12 +451,6 @@
      * Adds dynamic type from the given {@link DynamicBuilders.DynamicColor} for evaluation.
      * Evaluation will start immediately.
      *
-     * <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.
@@ -477,10 +471,6 @@
      *
      * <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.
@@ -502,10 +492,6 @@
      *
      * <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.
@@ -526,14 +512,86 @@
     }
 
     /**
-     * Adds dynamic type from the given {@link DynamicBuilders.DynamicBool} for evaluation.
+     * Adds dynamic type from the given {@link DynamicBuilders.DynamicDuration} for evaluation.
      * Evaluation will start immediately.
      *
+     * @param durationSource The given duration dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     * UI thread.
+     */
+    @NonNull
+    public BoundDynamicType bind(
+        @NonNull DynamicBuilders.DynamicDuration durationSource,
+        @NonNull DynamicTypeValueReceiver<Duration> consumer) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(durationSource.toDynamicDurationProto(), consumer, resultBuilder);
+        processBindings(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds pending dynamic type from the given {@link DynamicDuration} 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 durationSource The given durations dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     * UI thread.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public BoundDynamicType bind(
+        @NonNull DynamicDuration durationSource,
+        @NonNull DynamicTypeValueReceiver<Duration> consumer) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(durationSource, consumer, resultBuilder);
+        mDynamicTypeNodes.addAll(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds dynamic type from the given {@link DynamicBuilders.DynamicInstant} for evaluation.
+     * Evaluation will start immediately.
+     *
+     * @param instantSource The given instant dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     * UI thread.
+     */
+    @NonNull
+    public BoundDynamicType bind(
+        @NonNull DynamicBuilders.DynamicInstant instantSource,
+        @NonNull DynamicTypeValueReceiver<Instant> consumer) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(instantSource.toDynamicInstantProto(), consumer, resultBuilder);
+        processBindings(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds pending dynamic type from the given {@link DynamicInstant} for future evaluation.
+     *
+     * <p>Evaluation of this dynamic type will start when {@link #processPendingBindings} is called.
+     *
+     * @param instantSource The given instant dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     * UI thread.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public BoundDynamicType bind(
+        @NonNull DynamicInstant instantSource,
+        @NonNull DynamicTypeValueReceiver<Instant> consumer) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(instantSource, consumer, resultBuilder);
+        mDynamicTypeNodes.addAll(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds dynamic type from the given {@link DynamicBuilders.DynamicBool} for evaluation.
+     * Evaluation will start immediately.
      *
      * @param boolSource The given boolean dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
@@ -554,10 +612,6 @@
      *
      * <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 boolSource The given boolean dynamic type that should be evaluated.
      * @param consumer The registered consumer for results of the evaluation. It will be called from
      *     UI thread.
@@ -598,7 +652,8 @@
                     bindRecursively(
                             stringSource.getInt32FormatOp().getInput(),
                             int32FormatNode.getIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     break;
                 }
             case FLOAT_FORMAT_OP:
@@ -677,7 +732,8 @@
     private void bindRecursively(
             @NonNull DynamicInt32 int32Source,
             @NonNull DynamicTypeValueReceiver<Integer> consumer,
-            @NonNull List<DynamicDataNode<?>> resultBuilder) {
+            @NonNull List<DynamicDataNode<?>> resultBuilder,
+            @NonNull Optional<Integer> animationFallbackValue) {
         DynamicDataNode<Integer> node;
 
         switch (int32Source.getInnerCase()) {
@@ -685,10 +741,8 @@
                 node = new FixedInt32Node(int32Source.getFixed(), consumer);
                 break;
             case PLATFORM_SOURCE:
-                node =
-                        new PlatformInt32SourceNode(
+                node = new PlatformInt32SourceNode(
                                 int32Source.getPlatformSource(),
-                                mTimeDataSource,
                                 mSensorGatewayDataSource,
                                 consumer);
                 break;
@@ -701,11 +755,13 @@
                     bindRecursively(
                             int32Source.getArithmeticOperation().getInputLhs(),
                             arithmeticNode.getLhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             int32Source.getArithmeticOperation().getInputRhs(),
                             arithmeticNode.getRhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     break;
                 }
@@ -728,11 +784,13 @@
                     bindRecursively(
                             op.getValueIfTrue(),
                             conditionalNode.getTrueValueIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             op.getValueIfFalse(),
                             conditionalNode.getFalseValueIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     node = conditionalNode;
                     break;
@@ -750,6 +808,65 @@
                             Optional.empty());
                     break;
                 }
+            case DURATION_PART:
+            {
+                GetDurationPartOpNode durationPartOpNode =
+                    new GetDurationPartOpNode(int32Source.getDurationPart(), consumer);
+                node = durationPartOpNode;
+
+                bindRecursively(
+                    int32Source.getDurationPart().getInput(),
+                    durationPartOpNode.getIncomingCallback(),
+                    resultBuilder);
+                break;
+            }
+            case ANIMATABLE_FIXED:
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedInt32Node(
+                                    FixedInt32.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 AnimatableFixedInt32Node(
+                                    int32Source.getAnimatableFixed(), consumer,
+                                    mAnimationQuotaManager);
+                }
+                break;
+            case ANIMATABLE_DYNAMIC:
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedInt32Node(
+                                    FixedInt32.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.
+                    AnimatableDynamicInt32 dynamicNode = int32Source.getAnimatableDynamic();
+                    DynamicAnimatedInt32Node animationNode =
+                            new DynamicAnimatedInt32Node(consumer, dynamicNode.getAnimationSpec(),
+                                    mAnimationQuotaManager);
+                    node = animationNode;
+
+                    bindRecursively(
+                            dynamicNode.getInput(),
+                            animationNode.getInputCallback(),
+                            resultBuilder,
+                            animationFallbackValue);
+                }
+                break;
             case INNER_NOT_SET:
                 throw new IllegalArgumentException("DynamicInt32 has no inner source set");
             default:
@@ -760,6 +877,67 @@
     }
 
     /**
+     * Same as {@link #bind(DynamicBuilders.DynamicDuration, 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 DynamicDuration durationSource,
+        @NonNull DynamicTypeValueReceiver<Duration> consumer,
+        @NonNull List<DynamicDataNode<?>> resultBuilder) {
+        DynamicDataNode<?> node;
+
+        switch (durationSource.getInnerCase()) {
+            case BETWEEN:
+                BetweenInstancesNode betweenInstancesNode = new BetweenInstancesNode(consumer);
+                node = betweenInstancesNode;
+                bindRecursively(
+                    durationSource.getBetween().getStartInclusive(),
+                    betweenInstancesNode.getLhsIncomingCallback(),
+                    resultBuilder);
+                bindRecursively(
+                    durationSource.getBetween().getEndExclusive(),
+                    betweenInstancesNode.getRhsIncomingCallback(),
+                    resultBuilder);
+                break;
+            case INNER_NOT_SET:
+                throw new IllegalArgumentException("DynamicDuration has no inner source set");
+            default:
+                throw new IllegalArgumentException("Unknown DynamicDuration source type");
+        }
+
+        resultBuilder.add(node);
+    }
+
+    /**
+     * Same as {@link #bind(DynamicBuilders.DynamicInstant, 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 DynamicInstant instantSource,
+        @NonNull DynamicTypeValueReceiver<Instant> consumer,
+        @NonNull List<DynamicDataNode<?>> resultBuilder) {
+        DynamicDataNode<?> node;
+
+        switch (instantSource.getInnerCase()) {
+            case FIXED:
+                node = new FixedInstantNode(instantSource.getFixed(), consumer);
+                break;
+            case PLATFORM_SOURCE:
+                node = new PlatformTimeSourceNode(mTimeDataSource, consumer);
+                break;
+
+            case INNER_NOT_SET:
+                throw new IllegalArgumentException("DynamicInstant has no inner source set");
+            default:
+                throw new IllegalArgumentException("Unknown DynamicInstant source type");
+        }
+
+        resultBuilder.add(node);
+    }
+
+    /**
      * 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.
@@ -807,7 +985,8 @@
                     bindRecursively(
                             floatSource.getInt32ToFloatOperation().getInput(),
                             toFloatNode.getIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     break;
                 }
             case CONDITIONAL_OP:
@@ -872,7 +1051,10 @@
                     AnimatableDynamicFloat dynamicNode = floatSource.getAnimatableDynamic();
                     DynamicAnimatedFloatNode animationNode =
                             new DynamicAnimatedFloatNode(
-                                    consumer, dynamicNode.getSpec(), mAnimationQuotaManager);
+                                    consumer,
+                                    dynamicNode.getAnimationSpec(),
+                                    mAnimationQuotaManager
+                            );
                     node = animationNode;
 
                     bindRecursively(
@@ -953,7 +1135,10 @@
                     AnimatableDynamicColor dynamicNode = colorSource.getAnimatableDynamic();
                     DynamicAnimatedColorNode animationNode =
                             new DynamicAnimatedColorNode(
-                                    consumer, dynamicNode.getSpec(), mAnimationQuotaManager);
+                                    consumer,
+                                    dynamicNode.getAnimationSpec(),
+                                    mAnimationQuotaManager
+                            );
                     node = animationNode;
 
                     bindRecursively(
@@ -999,11 +1184,13 @@
                     bindRecursively(
                             boolSource.getInt32Comparison().getInputLhs(),
                             compNode.getLhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             boolSource.getInt32Comparison().getInputRhs(),
                             compNode.getRhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     break;
                 }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/EpochTimePlatformDataSource.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/EpochTimePlatformDataSource.java
new file mode 100644
index 0000000..37c858e
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/EpochTimePlatformDataSource.java
@@ -0,0 +1,60 @@
+/*
+ * 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.collection.SimpleArrayMap;
+import androidx.wear.protolayout.expression.pipeline.TimeGateway.TimeCallback;
+
+import java.time.Instant;
+import java.util.concurrent.Executor;
+
+/** Utility for time data source. */
+class EpochTimePlatformDataSource {
+    private final Executor mUiExecutor;
+    private final TimeGateway mGateway;
+    private final SimpleArrayMap<DynamicTypeValueReceiver<Instant>, TimeCallback>
+            mConsumerToTimeCallback = new SimpleArrayMap<>();
+
+    EpochTimePlatformDataSource(Executor uiExecutor, TimeGateway gateway) {
+        mUiExecutor = uiExecutor;
+        mGateway = gateway;
+    }
+
+    public void registerForData(DynamicTypeValueReceiver<Instant> consumer) {
+        TimeCallback timeCallback =
+                new TimeCallback() {
+                    @Override
+                    public void onPreUpdate() {
+                        consumer.onPreUpdate();
+                    }
+
+                    @Override
+                    public void onData() {
+                        consumer.onData(Instant.now());
+                    }
+                };
+        mGateway.registerForUpdates(mUiExecutor, timeCallback);
+        mConsumerToTimeCallback.put(consumer, timeCallback);
+    }
+
+    public void unregisterForData(DynamicTypeValueReceiver<Instant> consumer) {
+        TimeCallback timeCallback = mConsumerToTimeCallback.remove(consumer);
+        if (timeCallback != null) {
+            mGateway.unregisterForUpdates(timeCallback);
+        }
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/FloatNodes.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/FloatNodes.java
index 73727de..4c1027b 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/FloatNodes.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/FloatNodes.java
@@ -145,7 +145,7 @@
                     ValueAnimator.ofFloat(mProtoNode.getFromValue(), mProtoNode.getToValue());
             animator.addUpdateListener(a -> mDownstream.onData((float) a.getAnimatedValue()));
 
-            applyAnimationSpecToAnimator(animator, mProtoNode.getSpec());
+            applyAnimationSpecToAnimator(animator, mProtoNode.getAnimationSpec());
 
             mQuotaAwareAnimator.updateAnimator(animator);
             startOrSkipAnimator();
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/InstantNodes.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/InstantNodes.java
new file mode 100644
index 0000000..012469c
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/InstantNodes.java
@@ -0,0 +1,86 @@
+/*
+ * 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 androidx.annotation.UiThread;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedInstant;
+
+import java.time.Instant;
+
+/** Dynamic data nodes which yield instants. */
+class InstantNodes {
+    private InstantNodes() {}
+    /** Dynamic instant node that has a fixed value. */
+    static class FixedInstantNode implements DynamicDataSourceNode<Integer> {
+        private final Instant mValue;
+        private final DynamicTypeValueReceiver<Instant> mDownstream;
+
+        FixedInstantNode(FixedInstant protoNode, DynamicTypeValueReceiver<Instant> downstream) {
+            this.mValue = Instant.ofEpochSecond(protoNode.getEpochSeconds());
+            this.mDownstream = downstream;
+        }
+
+        @Override
+        @UiThread
+        public void preInit() {
+            mDownstream.onPreUpdate();
+        }
+
+        @Override
+        @UiThread
+        public void init() {
+            mDownstream.onData(mValue);
+        }
+
+        @Override
+        public void destroy() {}
+    }
+    /** Dynamic Instant node that gets value from the platform source. */
+    static class PlatformTimeSourceNode implements DynamicDataSourceNode<Integer> {
+        @Nullable private final EpochTimePlatformDataSource mEpochTimePlatformDataSource;
+        private final DynamicTypeValueReceiver<Instant> mDownstream;
+
+        PlatformTimeSourceNode(
+                @Nullable EpochTimePlatformDataSource epochTimePlatformDataSource,
+                DynamicTypeValueReceiver<Instant> downstream) {
+            this.mEpochTimePlatformDataSource = epochTimePlatformDataSource;
+            this.mDownstream = downstream;
+        }
+
+        @Override
+        @UiThread
+        public void preInit() {}
+
+        @Override
+        @UiThread
+        public void init() {
+            if (mEpochTimePlatformDataSource != null) {
+                mEpochTimePlatformDataSource.registerForData(mDownstream);
+            } else {
+                mDownstream.onInvalidated();
+            }
+        }
+
+        @Override
+        @UiThread
+        public void destroy() {
+            if (mEpochTimePlatformDataSource != null) {
+                mEpochTimePlatformDataSource.unregisterForData(mDownstream);
+            }
+        }
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/Int32Nodes.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/Int32Nodes.java
index 53a7968..a2c9a94 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/Int32Nodes.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/Int32Nodes.java
@@ -16,19 +16,27 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
-import android.util.Log;
+import static androidx.wear.protolayout.expression.pipeline.AnimationsHelper.applyAnimationSpecToAnimator;
+import static java.lang.Math.abs;
 
+import android.animation.ValueAnimator;
+import android.util.Log;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.UiThread;
-import androidx.wear.protolayout.expression.pipeline.PlatformDataSources.EpochTimePlatformDataSource;
 import androidx.wear.protolayout.expression.pipeline.PlatformDataSources.PlatformDataSource;
 import androidx.wear.protolayout.expression.pipeline.PlatformDataSources.SensorGatewayPlatformDataSource;
+import androidx.wear.protolayout.expression.proto.AnimationParameterProto.AnimationSpec;
+import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableFixedInt32;
 import androidx.wear.protolayout.expression.proto.DynamicProto.ArithmeticInt32Op;
+import androidx.wear.protolayout.expression.proto.DynamicProto.DurationPartType;
 import androidx.wear.protolayout.expression.proto.DynamicProto.FloatToInt32Op;
 import androidx.wear.protolayout.expression.proto.DynamicProto.PlatformInt32Source;
 import androidx.wear.protolayout.expression.proto.DynamicProto.PlatformInt32SourceType;
 import androidx.wear.protolayout.expression.proto.DynamicProto.StateInt32Source;
+import androidx.wear.protolayout.expression.proto.DynamicProto.GetDurationPartOp;
 import androidx.wear.protolayout.expression.proto.FixedProto.FixedInt32;
+import java.time.Duration;
 
 /** Dynamic data nodes which yield integers. */
 class Int32Nodes {
@@ -66,17 +74,14 @@
         private static final String TAG = "PlatformInt32SourceNode";
 
         @Nullable private final SensorGatewayPlatformDataSource mSensorGatewaySource;
-        @Nullable private final EpochTimePlatformDataSource mEpochTimePlatformDataSource;
         private final PlatformInt32Source mProtoNode;
         private final DynamicTypeValueReceiver<Integer> mDownstream;
 
         PlatformInt32SourceNode(
                 PlatformInt32Source protoNode,
-                @Nullable EpochTimePlatformDataSource epochTimePlatformDataSource,
                 @Nullable SensorGatewayPlatformDataSource sensorGatewaySource,
                 DynamicTypeValueReceiver<Integer> downstream) {
             this.mProtoNode = protoNode;
-            this.mEpochTimePlatformDataSource = epochTimePlatformDataSource;
             this.mSensorGatewaySource = sensorGatewaySource;
             this.mDownstream = downstream;
         }
@@ -122,8 +127,6 @@
                 case PLATFORM_INT32_SOURCE_TYPE_CURRENT_HEART_RATE:
                 case PLATFORM_INT32_SOURCE_TYPE_DAILY_STEP_COUNT:
                     return mSensorGatewaySource;
-                case PLATFORM_INT32_SOURCE_TYPE_EPOCH_TIME_SECONDS:
-                    return mEpochTimePlatformDataSource;
             }
             Log.w(TAG, "Unknown PlatformInt32SourceType");
             return null;
@@ -203,4 +206,163 @@
                     });
         }
     }
+
+    /** Dynamic integer node that gets duration part from a duration. */
+    static class GetDurationPartOpNode extends DynamicDataTransformNode<Duration, Integer> {
+
+        private static final String TAG = "GetDurationPartOpNode";
+
+        GetDurationPartOpNode(
+            GetDurationPartOp protoNode, DynamicTypeValueReceiver<Integer> downstream) {
+            super(downstream,
+                duration -> (int) getDurationPart(duration, protoNode.getDurationPart()));
+        }
+
+        private static long getDurationPart(Duration duration, DurationPartType durationPartType) {
+            switch (durationPartType) {
+                case DURATION_PART_TYPE_UNDEFINED:
+                case UNRECOGNIZED:
+                    Log.e(TAG, "Unknown duration part type in GetDurationPartOpNode");
+                    return 0;
+                case DURATION_PART_TYPE_DAYS:
+                    return abs(duration.getSeconds() / (3600 * 24));
+                case DURATION_PART_TYPE_HOURS:
+                    return abs((duration.getSeconds() / 3600) % 24);
+                case DURATION_PART_TYPE_MINUTES:
+                    return abs((duration.getSeconds() / 60) % 60);
+                case DURATION_PART_TYPE_SECONDS:
+                    return abs(duration.getSeconds() % 60);
+                case DURATION_PART_TYPE_TOTAL_DAYS:
+                    return duration.toDays();
+                case DURATION_PART_TYPE_TOTAL_HOURS:
+                    return duration.toHours();
+                case DURATION_PART_TYPE_TOTAL_MINUTES:
+                    return duration.toMinutes();
+                case DURATION_PART_TYPE_TOTAL_SECONDS:
+                    return duration.getSeconds();
+            }
+            throw new IllegalArgumentException("Unknown duration part");
+        }
+    }
+
+    /** Dynamic int32 node that gets animatable value from fixed source. */
+    static class AnimatableFixedInt32Node extends AnimatableNode
+            implements DynamicDataSourceNode<Integer> {
+
+        private final AnimatableFixedInt32 mProtoNode;
+        private final DynamicTypeValueReceiver<Integer> mDownstream;
+
+        AnimatableFixedInt32Node(
+                AnimatableFixedInt32 protoNode,
+                DynamicTypeValueReceiver<Integer> downstream,
+                QuotaManager quotaManager) {
+            super(quotaManager);
+            this.mProtoNode = protoNode;
+            this.mDownstream = downstream;
+        }
+
+        @Override
+        @UiThread
+        public void preInit() {
+            mDownstream.onPreUpdate();
+        }
+
+        @Override
+        @UiThread
+        public void init() {
+            ValueAnimator animator =
+                    ValueAnimator.ofInt(mProtoNode.getFromValue(), mProtoNode.getToValue());
+            applyAnimationSpecToAnimator(animator, mProtoNode.getAnimationSpec());
+            animator.addUpdateListener(a -> mDownstream.onData((Integer) a.getAnimatedValue()));
+            mQuotaAwareAnimator.updateAnimator(animator);
+            startOrSkipAnimator();
+        }
+
+        @Override
+        @UiThread
+        public void destroy() {
+            mQuotaAwareAnimator.stopAnimator();
+        }
+    }
+
+    /** Dynamic int32 node that gets animatable value from dynamic source. */
+    static class DynamicAnimatedInt32Node extends AnimatableNode implements
+            DynamicDataNode<Integer> {
+
+        final DynamicTypeValueReceiver<Integer> mDownstream;
+        private final DynamicTypeValueReceiver<Integer> mInputCallback;
+
+        @Nullable
+        Integer mCurrentValue = null;
+        int mPendingCalls = 0;
+
+        // Static analysis complains about calling methods of parent class AnimatableNode under
+        // initialization but mInputCallback is only used after the constructor is finished.
+        @SuppressWarnings("method.invocation.invalid")
+        DynamicAnimatedInt32Node(
+                DynamicTypeValueReceiver<Integer> downstream,
+                @NonNull AnimationSpec spec,
+                QuotaManager quotaManager) {
+            super(quotaManager);
+            this.mDownstream = downstream;
+            this.mInputCallback =
+                    new DynamicTypeValueReceiver<Integer>() {
+                        @Override
+                        public void onPreUpdate() {
+                            mPendingCalls++;
+
+                            if (mPendingCalls == 1) {
+                                mDownstream.onPreUpdate();
+
+                                mQuotaAwareAnimator.resetAnimator();
+                            }
+                        }
+
+                        @Override
+                        public void onData(Integer newData) {
+                            if (mPendingCalls > 0) {
+                                mPendingCalls--;
+                            }
+
+                            if (mPendingCalls == 0) {
+                                if (mCurrentValue == null) {
+                                    mCurrentValue = newData;
+                                    mDownstream.onData(mCurrentValue);
+                                } else {
+                                    ValueAnimator animator = ValueAnimator.ofInt(mCurrentValue,
+                                            newData);
+
+                                    applyAnimationSpecToAnimator(animator, spec);
+                                    animator.addUpdateListener(
+                                            a -> {
+                                                if (mPendingCalls == 0) {
+                                                    mCurrentValue = (Integer) a.getAnimatedValue();
+                                                    mDownstream.onData(mCurrentValue);
+                                                }
+                                            });
+
+                                    mQuotaAwareAnimator.updateAnimator(animator);
+                                    startOrSkipAnimator();
+                                }
+                            }
+                        }
+
+                        @Override
+                        public void onInvalidated() {
+                            if (mPendingCalls > 0) {
+                                mPendingCalls--;
+                            }
+
+                            if (mPendingCalls == 0) {
+                                mCurrentValue = null;
+                                mDownstream.onInvalidated();
+                            }
+                        }
+                    };
+        }
+
+        public DynamicTypeValueReceiver<Integer> getInputCallback() {
+            return mInputCallback;
+        }
+    }
 }
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 0f86713..b3a2ee2 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
@@ -22,8 +22,6 @@
 import androidx.annotation.DoNotInline;
 import androidx.annotation.RequiresApi;
 import androidx.collection.ArrayMap;
-import androidx.collection.SimpleArrayMap;
-import androidx.wear.protolayout.expression.pipeline.TimeGateway.TimeCallback;
 import androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway;
 import androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway.SensorDataType;
 import androidx.wear.protolayout.expression.proto.DynamicProto.PlatformInt32SourceType;
@@ -43,48 +41,6 @@
                 PlatformInt32SourceType sourceType, DynamicTypeValueReceiver<Integer> consumer);
     }
 
-    /** Utility for time data source. */
-    static class EpochTimePlatformDataSource implements PlatformDataSource {
-        private final Executor mUiExecutor;
-        private final TimeGateway mGateway;
-        private final SimpleArrayMap<DynamicTypeValueReceiver<Integer>, TimeCallback>
-                mConsumerToTimeCallback = new SimpleArrayMap<>();
-
-        EpochTimePlatformDataSource(Executor uiExecutor, TimeGateway gateway) {
-            mUiExecutor = uiExecutor;
-            mGateway = gateway;
-        }
-
-        @Override
-        public void registerForData(
-                PlatformInt32SourceType sourceType, DynamicTypeValueReceiver<Integer> consumer) {
-            TimeCallback timeCallback =
-                    new TimeCallback() {
-                        @Override
-                        public void onPreUpdate() {
-                            consumer.onPreUpdate();
-                        }
-
-                        @Override
-                        public void onData() {
-                            long currentEpochTimeSeconds = System.currentTimeMillis() / 1000;
-                            consumer.onData((int) currentEpochTimeSeconds);
-                        }
-                    };
-            mGateway.registerForUpdates(mUiExecutor, timeCallback);
-            mConsumerToTimeCallback.put(consumer, timeCallback);
-        }
-
-        @Override
-        public void unregisterForData(
-                PlatformInt32SourceType sourceType, DynamicTypeValueReceiver<Integer> consumer) {
-            TimeCallback timeCallback = mConsumerToTimeCallback.remove(consumer);
-            if (timeCallback != null) {
-                mGateway.unregisterForUpdates(timeCallback);
-            }
-        }
-    }
-
     /** Utility for sensor data source. */
     static class SensorGatewayPlatformDataSource implements PlatformDataSource {
         private static final String TAG = "SensorGtwPltDataSource";
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/sensor/SensorGateway.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/sensor/SensorGateway.java
index 513f38d..1f16396 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/sensor/SensorGateway.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/sensor/SensorGateway.java
@@ -17,10 +17,12 @@
 package androidx.wear.protolayout.expression.pipeline.sensor;
 
 import android.Manifest;
+import android.os.Build.VERSION_CODES;
 
 import androidx.annotation.AnyThread;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
@@ -54,6 +56,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Retention(RetentionPolicy.SOURCE)
+    @RequiresApi(VERSION_CODES.Q)
     @IntDef({
         SENSOR_DATA_TYPE_INVALID,
         SENSOR_DATA_TYPE_HEART_RATE,
@@ -77,6 +80,7 @@
      * each day, and any subscriptions to this data type will log the number of steps the user has
      * done since 12:00AM local time.
      */
+    @RequiresApi(VERSION_CODES.Q)
     @RequiresPermission(Manifest.permission.ACTIVITY_RECOGNITION)
     int SENSOR_DATA_TYPE_DAILY_STEP_COUNT = 1;
 
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
index 7f9e3cb..d2ab0198 100644
--- 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
@@ -27,8 +27,10 @@
 
 import androidx.annotation.NonNull;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter;
 import androidx.wear.protolayout.expression.DynamicBuilders.DynamicString;
@@ -45,6 +47,8 @@
 import org.junit.runner.RunWith;
 import org.robolectric.ParameterizedRobolectricTestRunner;
 
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.BiConsumer;
@@ -151,6 +155,33 @@
                 test(DynamicInt32.constant(10).gte(11), false),
                 test(DynamicInt32.constant(10).gte(10), true),
                 test(DynamicInt32.constant(10).gte(5), true),
+                // Instant maximum value
+                test(DynamicInstant.withSecondsPrecision(Instant.MAX),
+                    Instant.MAX.truncatedTo(ChronoUnit.SECONDS)),
+                // Duration Int overflow
+                test(
+                    DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+                        .durationUntil(DynamicInstant.withSecondsPrecision(Instant.MAX))
+                        .toIntSeconds(),
+                    (int) Instant.MAX.getEpochSecond()),
+                // Positive duration
+                test(durationOfSeconds(123456L).toIntDays(), 1),
+                test(durationOfSeconds(123456L).toIntHours(), 34),
+                test(durationOfSeconds(123456L).toIntMinutes(), 2057),
+                test(durationOfSeconds(123456L).toIntSeconds(), 123456),
+                test(durationOfSeconds(123456L).getIntDaysPart(), 1),
+                test(durationOfSeconds(123456L).getHoursPart(), 10),
+                test(durationOfSeconds(123456L).getMinutesPart(), 17),
+                test(durationOfSeconds(123456L).getSecondsPart(), 36),
+                // Negative duration
+                test(durationOfSeconds(-123456L).toIntDays(), -1),
+                test(durationOfSeconds(-123456L).toIntHours(), -34),
+                test(durationOfSeconds(-123456L).toIntMinutes(), -2057),
+                test(durationOfSeconds(-123456L).toIntSeconds(), -123456),
+                test(durationOfSeconds(-123456L).getIntDaysPart(), 1),
+                test(durationOfSeconds(-123456L).getHoursPart(), 10),
+                test(durationOfSeconds(-123456L).getMinutesPart(), 17),
+                test(durationOfSeconds(-123456L).getSecondsPart(), 36),
                 test(
                         DynamicString.onCondition(DynamicBool.constant(true))
                                 .use(constant("Hello"))
@@ -271,6 +302,17 @@
                 expectedValue);
     }
 
+    private static DynamicTypeEvaluatorTest.TestCase<Instant> test(
+        DynamicInstant bindUnderTest, Instant instant) {
+      return new DynamicTypeEvaluatorTest.TestCase<>(
+          bindUnderTest.toDynamicInstantProto().toString(),
+          (evaluator, cb) -> {
+            evaluator.bind(bindUnderTest, cb);
+            evaluator.processPendingBindings();
+          },
+          instant);
+    }
+
     private static DynamicTypeEvaluatorTest.TestCase<Float> test(
             DynamicFloat bindUnderTest, Float expectedValue) {
         return new DynamicTypeEvaluatorTest.TestCase<>(
@@ -341,6 +383,12 @@
         }
     }
 
+    private static DynamicDuration durationOfSeconds(long seconds) {
+      Instant now = Instant.now();
+      return DynamicInstant.withSecondsPrecision(now)
+          .durationUntil(DynamicInstant.withSecondsPrecision(now.plusSeconds(seconds)));
+    }
+
     private static ImmutableMap<String, StateEntryValue> generateExampleState() {
         return ImmutableMap.of(
                 "state_hello_world",
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
index dc0d8d4..ddb9ec7 100644
--- 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
@@ -18,14 +18,23 @@
 
 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.Int32Nodes.AnimatableFixedInt32Node;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.DynamicAnimatedInt32Node;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.FixedInt32Node;
 import androidx.wear.protolayout.expression.pipeline.Int32Nodes.StateInt32SourceNode;
+import androidx.wear.protolayout.expression.proto.AnimationParameterProto.AnimationSpec;
+import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableFixedInt32;
 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 com.google.common.collect.Iterables;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -97,4 +106,127 @@
 
         assertThat(results).containsExactly(12);
     }
+
+    @Test
+    public void animatableFixedInt32_animates() {
+        int startValue = 3;
+        int endValue = 33;
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        AnimatableFixedInt32 protoNode =
+                AnimatableFixedInt32.newBuilder().setFromValue(startValue).setToValue(
+                        endValue).build();
+        AnimatableFixedInt32Node node =
+                new AnimatableFixedInt32Node(protoNode, new AddToListCallback<>(results),
+                        quotaManager);
+        node.setVisibility(true);
+
+        node.init();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results.size()).isGreaterThan(2);
+        assertThat(results.get(0)).isEqualTo(startValue);
+        assertThat(Iterables.getLast(results)).isEqualTo(endValue);
+    }
+
+    @Test
+    public void animatableFixedInt32_whenInvisible_skipToEnd() {
+        int startValue = 3;
+        int endValue = 33;
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        AnimatableFixedInt32 protoNode =
+                AnimatableFixedInt32.newBuilder().setFromValue(startValue).setToValue(
+                        endValue).build();
+        AnimatableFixedInt32Node node =
+                new AnimatableFixedInt32Node(protoNode, new AddToListCallback<>(results),
+                        quotaManager);
+        node.setVisibility(false);
+
+        node.init();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results).hasSize(1);
+        assertThat(results).containsExactly(endValue);
+    }
+
+    @Test
+    public void animatableFixedInt32_whenNoQuota_skip() {
+        int startValue = 3;
+        int endValue = 33;
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new TestNoQuotaManagerImpl();
+        AnimatableFixedInt32 protoNode =
+                AnimatableFixedInt32.newBuilder().setFromValue(startValue).setToValue(
+                        endValue).build();
+        AnimatableFixedInt32Node node =
+                new AnimatableFixedInt32Node(protoNode, new AddToListCallback<>(results),
+                        quotaManager);
+        node.setVisibility(true);
+
+        node.init();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results).hasSize(1);
+        assertThat(results).containsExactly(endValue);
+    }
+
+    @Test
+    public void dynamicAnimatedInt32_onlyAnimateWhenVisible() {
+        int value1 = 3;
+        int value2 = 11;
+        int value3 = 17;
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setInt32Val(
+                                                FixedInt32.newBuilder().setValue(value1).build())
+                                        .build()));
+        DynamicAnimatedInt32Node int32Node =
+                new DynamicAnimatedInt32Node(
+                        new AddToListCallback<>(results), AnimationSpec.getDefaultInstance(),
+                        quotaManager);
+        int32Node.setVisibility(false);
+        StateInt32SourceNode stateNode =
+                new StateInt32SourceNode(
+                        oss,
+                        StateInt32Source.newBuilder().setSourceKey("foo").build(),
+                        int32Node.getInputCallback());
+
+        stateNode.preInit();
+        stateNode.init();
+
+        results.clear();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setInt32Val(FixedInt32.newBuilder().setValue(value2))
+                                .build()));
+        shadowOf(Looper.getMainLooper()).idle();
+
+        // Only contains last value.
+        assertThat(results).hasSize(1);
+        assertThat(results).containsExactly(value2);
+
+        int32Node.setVisibility(true);
+        results.clear();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setInt32Val(FixedInt32.newBuilder().setValue(value3))
+                                .build()));
+        shadowOf(Looper.getMainLooper()).idle();
+
+        // Contains intermediate values besides the initial and last.
+        assertThat(results.size()).isGreaterThan(2);
+        assertThat(results.get(0)).isEqualTo(value2);
+        assertThat(Iterables.getLast(results)).isEqualTo(value3);
+        assertThat(results).isInOrder();
+    }
 }
diff --git a/wear/protolayout/protolayout-expression/api/current.txt b/wear/protolayout/protolayout-expression/api/current.txt
index d9949ab..1e3c3ea 100644
--- a/wear/protolayout/protolayout-expression/api/current.txt
+++ b/wear/protolayout/protolayout-expression/api/current.txt
@@ -104,6 +104,19 @@
     method public default byte[] toDynamicColorByteArray();
   }
 
+  public static interface DynamicBuilders.DynamicDuration extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[]);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHoursPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getIntDaysPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinutesPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecondsPart();
+    method public default byte[] toDynamicDurationByteArray();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntDays();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntHours();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntMinutes();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntSeconds();
+  }
+
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
@@ -156,7 +169,21 @@
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter with();
   }
 
+  public static interface DynamicBuilders.DynamicInstant extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration durationUntil(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[]);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant platformTimeWithSecondsPrecision();
+    method public default byte[] toDynamicInstantByteArray();
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant withSecondsPrecision(java.time.Instant);
+  }
+
   public static interface DynamicBuilders.DynamicInt32 extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat asFloat();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 constant(int);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
@@ -228,5 +255,20 @@
     method public static androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue fromString(String);
   }
 
+  public final class VersionBuilders {
+  }
+
+  public static final class VersionBuilders.VersionInfo {
+    method public int getMajor();
+    method public int getMinor();
+  }
+
+  public static final class VersionBuilders.VersionInfo.Builder {
+    ctor public VersionBuilders.VersionInfo.Builder();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo build();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMajor(int);
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMinor(int);
+  }
+
 }
 
diff --git a/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt b/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
index be278c8..3c2d79b 100644
--- a/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
+++ b/wear/protolayout/protolayout-expression/api/public_plus_experimental_current.txt
@@ -104,6 +104,19 @@
     method public default byte[] toDynamicColorByteArray();
   }
 
+  public static interface DynamicBuilders.DynamicDuration extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[]);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHoursPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getIntDaysPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinutesPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecondsPart();
+    method public default byte[] toDynamicDurationByteArray();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntDays();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntHours();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntMinutes();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntSeconds();
+  }
+
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
@@ -156,7 +169,21 @@
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter with();
   }
 
+  public static interface DynamicBuilders.DynamicInstant extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration durationUntil(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[]);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant platformTimeWithSecondsPrecision();
+    method public default byte[] toDynamicInstantByteArray();
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant withSecondsPrecision(java.time.Instant);
+  }
+
   public static interface DynamicBuilders.DynamicInt32 extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat asFloat();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 constant(int);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
@@ -231,5 +258,20 @@
     method public static androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue fromString(String);
   }
 
+  public final class VersionBuilders {
+  }
+
+  public static final class VersionBuilders.VersionInfo {
+    method public int getMajor();
+    method public int getMinor();
+  }
+
+  public static final class VersionBuilders.VersionInfo.Builder {
+    ctor public VersionBuilders.VersionInfo.Builder();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo build();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMajor(int);
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMinor(int);
+  }
+
 }
 
diff --git a/wear/protolayout/protolayout-expression/api/restricted_current.txt b/wear/protolayout/protolayout-expression/api/restricted_current.txt
index d9949ab..1e3c3ea 100644
--- a/wear/protolayout/protolayout-expression/api/restricted_current.txt
+++ b/wear/protolayout/protolayout-expression/api/restricted_current.txt
@@ -104,6 +104,19 @@
     method public default byte[] toDynamicColorByteArray();
   }
 
+  public static interface DynamicBuilders.DynamicDuration extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration fromByteArray(byte[]);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getHoursPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getIntDaysPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getMinutesPart();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 getSecondsPart();
+    method public default byte[] toDynamicDurationByteArray();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntDays();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntHours();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntMinutes();
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 toIntSeconds();
+  }
+
   public static interface DynamicBuilders.DynamicFloat extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float);
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat animate(float, float, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
@@ -156,7 +169,21 @@
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter with();
   }
 
+  public static interface DynamicBuilders.DynamicInstant extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicDuration durationUntil(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant fromByteArray(byte[]);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant platformTimeWithSecondsPrecision();
+    method public default byte[] toDynamicInstantByteArray();
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInstant withSecondsPrecision(java.time.Instant);
+  }
+
   public static interface DynamicBuilders.DynamicInt32 extends androidx.wear.protolayout.expression.DynamicBuilders.DynamicType {
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(int, int, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String);
+    method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(String, androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate(androidx.wear.protolayout.expression.AnimationParameterBuilders.AnimationSpec);
+    method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 animate();
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat asFloat();
     method public static androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 constant(int);
     method public default androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32 div(androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32);
@@ -228,5 +255,20 @@
     method public static androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue fromString(String);
   }
 
+  public final class VersionBuilders {
+  }
+
+  public static final class VersionBuilders.VersionInfo {
+    method public int getMajor();
+    method public int getMinor();
+  }
+
+  public static final class VersionBuilders.VersionInfo.Builder {
+    ctor public VersionBuilders.VersionInfo.Builder();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo build();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMajor(int);
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo.Builder setMinor(int);
+  }
+
 }
 
diff --git a/wear/protolayout/protolayout-expression/build.gradle b/wear/protolayout/protolayout-expression/build.gradle
index eb396f8..7bb1001 100644
--- a/wear/protolayout/protolayout-expression/build.gradle
+++ b/wear/protolayout/protolayout-expression/build.gradle
@@ -40,7 +40,7 @@
     namespace "androidx.wear.protolayout.expression"
 
     defaultConfig {
-        minSdkVersion 25
+        minSdkVersion 26
     }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
index dfecd528..68edcea 100644
--- a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/DynamicBuilders.java
@@ -31,15 +31,16 @@
 import androidx.wear.protolayout.expression.FixedValueBuilders.FixedBool;
 import androidx.wear.protolayout.expression.FixedValueBuilders.FixedColor;
 import androidx.wear.protolayout.expression.FixedValueBuilders.FixedFloat;
+import androidx.wear.protolayout.expression.FixedValueBuilders.FixedInstant;
 import androidx.wear.protolayout.expression.FixedValueBuilders.FixedInt32;
 import androidx.wear.protolayout.expression.FixedValueBuilders.FixedString;
 import androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue;
 import androidx.wear.protolayout.expression.proto.DynamicProto;
 import androidx.wear.protolayout.protobuf.ExtensionRegistryLite;
 import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.time.Instant;
 
 /** Builders for dynamic primitive types used by layout elements. */
 public final class DynamicBuilders {
@@ -249,6 +250,101 @@
   static final int LOGICAL_OP_TYPE_OR = 2;
 
   /**
+   * The duration part to retrieve using {@link GetDurationPartOp}.
+   *
+   * @since 1.2
+   * @hide
+   */
+  @RestrictTo(RestrictTo.Scope.LIBRARY)
+  @IntDef({
+    DURATION_PART_TYPE_UNDEFINED,
+    DURATION_PART_TYPE_TOTAL_DAYS,
+    DURATION_PART_TYPE_TOTAL_HOURS,
+    DURATION_PART_TYPE_TOTAL_MINUTES,
+    DURATION_PART_TYPE_TOTAL_SECONDS,
+    DURATION_PART_TYPE_DAYS,
+    DURATION_PART_TYPE_HOURS,
+    DURATION_PART_TYPE_MINUTES,
+    DURATION_PART_TYPE_SECONDS
+  })
+  @Retention(RetentionPolicy.SOURCE)
+  @interface DurationPartType {}
+
+  /**
+   * Undefined duration part type.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_UNDEFINED = 0;
+
+  /**
+   * Total number of days in a duration. The fraction part of the result will be truncated. This is
+   * based on the standard definition of a day as 24 hours. Notice that the duration can be
+   * negative, in which case total number of days will be also negative.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_TOTAL_DAYS = 1;
+
+  /**
+   * Total number of hours in a duration. The fraction part of the result will be truncated. Notice
+   * that the duration can be negative, in which case total number of hours will be also negative.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_TOTAL_HOURS = 2;
+
+  /**
+   * Total number of minutes in a duration. The fraction part of the result will be truncated.
+   * Notice that the duration can be negative, in which case total number of minutes will be also
+   * negative.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_TOTAL_MINUTES = 3;
+
+  /**
+   * Total number of seconds in a duration. Notice that the duration can be negative, in which case
+   * total number of seconds will be also negative.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_TOTAL_SECONDS = 4;
+
+  /**
+   * Number of days part in the duration. This represents the absolute value of the total number of
+   * days in the duration based on the 24 hours day definition. The fraction part of the result will
+   * be truncated.
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_DAYS = 5;
+
+  /**
+   * Number of hours part in the duration. This represents the absolute value of remaining hours
+   * when dividing total hours by hours in a day (24 hours).
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_HOURS = 6;
+
+  /**
+   * Number of minutes part in the duration. This represents the absolute value of remaining minutes
+   * when dividing total minutes by minutes in an hour (60 minutes).
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_MINUTES = 7;
+
+  /**
+   * Number of seconds part in the duration. This represents the absolute value of remaining seconds
+   * when dividing total seconds by seconds in a minute (60 seconds).
+   *
+   * @since 1.2
+   */
+  static final int DURATION_PART_TYPE_SECONDS = 8;
+
+  /**
    * An arithmetic operation, operating on two Int32 instances. This implements simple binary
    * operations of the form "result = LHS <op> RHS", where the available operation types are
    * described in {@code ArithmeticOpType}.
@@ -884,6 +980,307 @@
   }
 
   /**
+   * A static interpolation node, between two fixed int32 values.
+   *
+   * @since 1.2
+   */
+  static final class AnimatableFixedInt32 implements DynamicInt32 {
+    private final DynamicProto.AnimatableFixedInt32 mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    AnimatableFixedInt32(
+            DynamicProto.AnimatableFixedInt32 impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets the value to start animating from.
+     *
+     * @since 1.2
+     */
+    public int getFromValue() {
+      return mImpl.getFromValue();
+    }
+
+    /**
+     * Gets the value to animate to.
+     *
+     * @since 1.2
+     */
+    public int getToValue() {
+      return mImpl.getToValue();
+    }
+
+    /**
+     * Gets the animation parameters for duration, delay, etc.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
+      } else {
+        return null;
+      }
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+    /**
+     * Creates a new wrapper instance from the proto.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public static AnimatableFixedInt32 fromProto(
+            @NonNull DynamicProto.AnimatableFixedInt32 proto, @Nullable Fingerprint fingerprint) {
+      return new AnimatableFixedInt32(proto, fingerprint);
+    }
+
+    @NonNull
+    static AnimatableFixedInt32 fromProto(@NonNull DynamicProto.AnimatableFixedInt32 proto) {
+      return fromProto(proto, null);
+    }
+
+    /**
+     * Returns the internal proto instance.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    DynamicProto.AnimatableFixedInt32 toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicInt32 toDynamicInt32Proto() {
+      return DynamicProto.DynamicInt32.newBuilder().setAnimatableFixed(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "AnimatableFixedInt32{"
+              + "fromValue="
+              + getFromValue()
+              + ", toValue="
+              + getToValue()
+              + ", animationSpec="
+              + getAnimationSpec()
+              + "}";
+    }
+
+    /** Builder for {@link AnimatableFixedInt32}. */
+    public static final class Builder implements DynamicInt32.Builder {
+      private final DynamicProto.AnimatableFixedInt32.Builder mImpl =
+              DynamicProto.AnimatableFixedInt32.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1831435966);
+
+      public Builder() {}
+
+      /**
+       * Sets the value to start animating from.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public AnimatableFixedInt32.Builder setFromValue(int fromValue) {
+        mImpl.setFromValue(fromValue);
+        mFingerprint.recordPropertyUpdate(1, fromValue);
+        return this;
+      }
+
+      /**
+       * Sets the value to animate to.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public AnimatableFixedInt32.Builder setToValue(int toValue) {
+        mImpl.setToValue(toValue);
+        mFingerprint.recordPropertyUpdate(2, toValue);
+        return this;
+      }
+
+      /**
+       * Sets the animation parameters for duration, delay, etc.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
+        mFingerprint.recordPropertyUpdate(
+            3, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public AnimatableFixedInt32 build() {
+        return new AnimatableFixedInt32(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
+   * A dynamic interpolation node. This will watch the value of its input and, when the first update
+   * arrives, immediately emit that value. On subsequent updates, it will animate between the old
+   * and new values.
+   *
+   * <p>If this node receives an invalid value (e.g. as a result of an upstream node having no
+   * value), then it will emit a single invalid value, and forget its "stored" value. The next valid
+   * value that arrives is then used as the "first" value again.
+   *
+   * @since 1.2
+   */
+  static final class AnimatableDynamicInt32 implements DynamicInt32 {
+    private final DynamicProto.AnimatableDynamicInt32 mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    AnimatableDynamicInt32(
+            DynamicProto.AnimatableDynamicInt32 impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets the value to watch, and animate when it changes.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public DynamicInt32 getInput() {
+      if (mImpl.hasInput()) {
+        return dynamicInt32FromProto(mImpl.getInput());
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Gets the animation parameters for duration, delay, etc.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
+      } else {
+        return null;
+      }
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+    /**
+     * Creates a new wrapper instance from the proto.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public static AnimatableDynamicInt32 fromProto(
+            @NonNull DynamicProto.AnimatableDynamicInt32 proto, @Nullable Fingerprint fingerprint) {
+      return new AnimatableDynamicInt32(proto, fingerprint);
+    }
+
+    @NonNull
+    static AnimatableDynamicInt32 fromProto(@NonNull DynamicProto.AnimatableDynamicInt32 proto) {
+      return fromProto(proto, null);
+    }
+
+    /**
+     * Returns the internal proto instance.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    DynamicProto.AnimatableDynamicInt32 toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicInt32 toDynamicInt32Proto() {
+      return DynamicProto.DynamicInt32.newBuilder().setAnimatableDynamic(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "AnimatableDynamicInt32{"
+          + "input="
+          + getInput()
+          + ", animationSpec="
+          + getAnimationSpec()
+          + "}";
+    }
+
+    /** Builder for {@link AnimatableDynamicInt32}. */
+    public static final class Builder implements DynamicInt32.Builder {
+      private final DynamicProto.AnimatableDynamicInt32.Builder mImpl =
+              DynamicProto.AnimatableDynamicInt32.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1554674954);
+
+      public Builder() {}
+
+      /**
+       * Sets the value to watch, and animate when it changes.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public AnimatableDynamicInt32.Builder setInput(@NonNull DynamicInt32 input) {
+        mImpl.setInput(input.toDynamicInt32Proto());
+        mFingerprint.recordPropertyUpdate(
+                1, checkNotNull(input.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      /**
+       * Sets the animation parameters for duration, delay, etc.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
+        mFingerprint.recordPropertyUpdate(
+            2, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public AnimatableDynamicInt32 build() {
+        return new AnimatableDynamicInt32(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
    * Interface defining a dynamic int32 type.
    *
    * <p>It offers a set of helper methods for creating arithmetic and logical expressions, e.g.
@@ -893,18 +1290,16 @@
    *
    * <p>For example the following expression is equivalent to {@code result = ((a + b)*c)/d }:
    *
-   * <pre>
+   * <pre>{@code
    * a.plus(b).times(c).div(d);
-   * </pre>
+   * }</pre>
    *
    * More complex expressions can be created by nesting expressions. For example the following
    * expression is equivalent to {@code result = (a + b)*(c - d) }:
    *
-   * <pre>
+   * <pre>{@code
    * (a.plus(b)).times(c.minus(d));
-   * </pre>
-   *
-   * .
+   * }</pre>
    *
    * @since 1.2
    */
@@ -956,6 +1351,87 @@
       return new StateInt32Source.Builder().setSourceKey(stateKey).build();
     }
 
+    /**
+     * Creates a {@link DynamicInt32} which will animate from {@code start} to {@code end}.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     */
+    @NonNull
+    static DynamicInt32 animate(int start, int end) {
+      return new AnimatableFixedInt32.Builder().setFromValue(start).setToValue(end).build();
+    }
+
+    /**
+     * Creates a {@link DynamicInt32} which will animate from {@code start} to {@code end} with the
+     * given animation parameters.
+     *
+     * @param start The start value of the range.
+     * @param end The end value of the range.
+     * @param animationSpec The animation parameters.
+     */
+    @NonNull
+    static DynamicInt32 animate(int start, int end, @NonNull AnimationSpec animationSpec) {
+      return new AnimatableFixedInt32.Builder()
+          .setFromValue(start)
+          .setToValue(end)
+          .setAnimationSpec(animationSpec)
+          .build();
+    }
+
+    /**
+     * Creates a {@link DynamicInt32} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicInt32} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with an int value from the provider's
+     *     state.
+     */
+    @NonNull
+    static DynamicInt32 animate(@NonNull String stateKey) {
+      return new AnimatableDynamicInt32.Builder().setInput(fromState(stateKey)).build();
+    }
+
+    /**
+     * Creates a {@link DynamicInt32} that is bound to the value of an item of the State. Every time
+     * the state value changes, this {@link DynamicInt32} will animate from its current value to the
+     * new value (from the state).
+     *
+     * @param stateKey The key to a {@link StateEntryValue} with an int value from the provider's
+     *     state.
+     * @param animationSpec The animation parameters.
+     */
+    @NonNull
+    static DynamicInt32 animate(@NonNull String stateKey, @NonNull AnimationSpec animationSpec) {
+      return new AnimatableDynamicInt32.Builder()
+          .setInput(fromState(stateKey))
+          .setAnimationSpec(animationSpec)
+          .build();
+    }
+
+    /**
+     * Returns a {@link DynamicInt32} that is bound to the value of this {@link DynamicInt32} and
+     * every time its value is changing, it animates from its current value to the new value.
+     *
+     * @param animationSpec The animation parameters.
+     */
+    @NonNull
+    default DynamicInt32 animate(@NonNull AnimationSpec animationSpec) {
+      return new AnimatableDynamicInt32.Builder()
+          .setInput(this)
+          .setAnimationSpec(animationSpec)
+          .build();
+    }
+
+    /**
+     * Returns a {@link DynamicInt32} that is bound to the value of this {@link DynamicInt32} and
+     * every time its value is changing, it animates from its current value to the new value.
+     */
+    @NonNull
+    default DynamicInt32 animate() {
+      return new AnimatableDynamicInt32.Builder().setInput(this).build();
+    }
+
     /** Convert the value represented by this {@link DynamicInt32} into a {@link DynamicFloat}. */
     @NonNull
     default DynamicFloat asFloat() {
@@ -1464,7 +1940,7 @@
     @NonNull
     default DynamicFloat rem(float other) {
       return new ArithmeticFloatOp.Builder()
-          .setInputLhs( this.asFloat())
+          .setInputLhs(this.asFloat())
           .setInputRhs(DynamicFloat.constant(other))
           .setOperationType(DynamicBuilders.ARITHMETIC_OP_TYPE_MODULO)
           .build();
@@ -1741,6 +2217,15 @@
     if (proto.hasFloatToInt()) {
       return FloatToInt32Op.fromProto(proto.getFloatToInt());
     }
+    if (proto.hasDurationPart()) {
+      return GetDurationPartOp.fromProto(proto.getDurationPart());
+    }
+    if (proto.hasAnimatableFixed()) {
+      return AnimatableFixedInt32.fromProto(proto.getAnimatableFixed());
+    }
+    if (proto.hasAnimatableDynamic()) {
+      return AnimatableDynamicInt32.fromProto(proto.getAnimatableDynamic());
+    }
     throw new IllegalStateException("Proto was not a recognised instance of DynamicInt32");
   }
 
@@ -2818,7 +3303,7 @@
   }
 
   /**
-   * An operation to convert a Int32 value in the dynamic data pipeline to a Float value.
+   * An operation to convert an Int32 value in the dynamic data pipeline to a Float value.
    *
    * @since 1.2
    */
@@ -2907,7 +3392,7 @@
   }
 
   /**
-   * A static interpolation, between two fixed floating point values.
+   * A static interpolation node, between two fixed floating point values.
    *
    * @since 1.2
    */
@@ -2945,9 +3430,9 @@
      * @since 1.2
      */
     @Nullable
-    public AnimationSpec getSpec() {
-      if (mImpl.hasSpec()) {
-        return AnimationSpec.fromProto(mImpl.getSpec());
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
       } else {
         return null;
       }
@@ -2987,8 +3472,8 @@
           + getFromValue()
           + ", toValue="
           + getToValue()
-          + ", spec="
-          + getSpec()
+          + ", animationSpec="
+          + getAnimationSpec()
           + "}";
     }
 
@@ -3030,10 +3515,10 @@
        * @since 1.2
        */
       @NonNull
-      public Builder setSpec(@NonNull AnimationSpec spec) {
-        mImpl.setSpec(spec.toProto());
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
         mFingerprint.recordPropertyUpdate(
-            3, checkNotNull(spec.getFingerprint()).aggregateValueAsInt());
+            3, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
         return this;
       }
 
@@ -3086,9 +3571,9 @@
      * @since 1.2
      */
     @Nullable
-    public AnimationSpec getSpec() {
-      if (mImpl.hasSpec()) {
-        return AnimationSpec.fromProto(mImpl.getSpec());
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
       } else {
         return null;
       }
@@ -3123,7 +3608,12 @@
     @Override
     @NonNull
     public String toString() {
-      return "AnimatableDynamicFloat{" + "input=" + getInput() + ", spec=" + getSpec() + "}";
+      return "AnimatableDynamicFloat{"
+          + "input="
+          + getInput()
+          + ", animationSpec="
+          + getAnimationSpec()
+          + "}";
     }
 
     /** Builder for {@link AnimatableDynamicFloat}. */
@@ -3153,10 +3643,10 @@
        * @since 1.2
        */
       @NonNull
-      public Builder setSpec(@NonNull AnimationSpec spec) {
-        mImpl.setSpec(spec.toProto());
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
         mFingerprint.recordPropertyUpdate(
-            3, checkNotNull(spec.getFingerprint()).aggregateValueAsInt());
+            3, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
         return this;
       }
 
@@ -3178,18 +3668,16 @@
    *
    * <p>For example the following expression is equivalent to {@code result = ((a + b)*c)/d }:
    *
-   * <pre>
+   * <pre>{@code
    * a.plus(b).times(c).div(d);
-   * </pre>
+   * }</pre>
    *
    * More complex expressions can be created by nesting expressions. For example the following
    * expression is equivalent to {@code result = (a + b)*(c - d) }:
    *
-   * <pre>
+   * <pre>{@code
    * (a.plus(b)).times(c.minus(d));
-   * </pre>
-   *
-   * .
+   * }</pre>
    *
    * @since 1.2
    */
@@ -3259,14 +3747,14 @@
      *
      * @param start The start value of the range.
      * @param end The end value of the range.
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
-    static DynamicFloat animate(float start, float end, @NonNull AnimationSpec spec) {
+    static DynamicFloat animate(float start, float end, @NonNull AnimationSpec animationSpec) {
       return new AnimatableFixedFloat.Builder()
           .setFromValue(start)
           .setToValue(end)
-          .setSpec(spec)
+          .setAnimationSpec(animationSpec)
           .build();
     }
 
@@ -3290,13 +3778,13 @@
      *
      * @param stateKey The key to a {@link StateEntryValue} with a float value from the providers
      *     state.
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
-    static DynamicFloat animate(@NonNull String stateKey, @NonNull AnimationSpec spec) {
+    static DynamicFloat animate(@NonNull String stateKey, @NonNull AnimationSpec animationSpec) {
       return new AnimatableDynamicFloat.Builder()
           .setInput(fromState(stateKey))
-          .setSpec(spec)
+          .setAnimationSpec(animationSpec)
           .build();
     }
 
@@ -3304,11 +3792,14 @@
      * Returns a {@link DynamicFloat} that is bound to the value of this {@link DynamicFloat} and
      * every time its value is changing, it animates from its current value to the new value.
      *
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
-    default DynamicFloat animate(@NonNull AnimationSpec spec) {
-      return new AnimatableDynamicFloat.Builder().setInput(this).setSpec(spec).build();
+    default DynamicFloat animate(@NonNull AnimationSpec animationSpec) {
+      return new AnimatableDynamicFloat.Builder()
+          .setInput(this)
+          .setAnimationSpec(animationSpec)
+          .build();
     }
 
     /**
@@ -3350,8 +3841,6 @@
     @SuppressWarnings("KotlinOperator")
     @NonNull
     default DynamicFloat plus(@NonNull DynamicFloat other) {
-
-      // overloaded operators.
       return new ArithmeticFloatOp.Builder()
           .setInputLhs(this)
           .setInputRhs(other)
@@ -3656,7 +4145,7 @@
     }
 
     /**
-     * reates a {@link DynamicFloat} containing the reminder of dividing this {@link DynamicFloat}
+     * Creates a {@link DynamicFloat} containing the reminder of dividing this {@link DynamicFloat}
      * by a float; As an example, the following is equal to {@code DynamicFloat.constant(1.5f)}
      *
      * <pre>
@@ -3680,7 +4169,7 @@
     }
 
     /**
-     * reates a {@link DynamicFloat} containing the reminder of dividing this {@link DynamicFloat}
+     * Creates a {@link DynamicFloat} containing the reminder of dividing this {@link DynamicFloat}
      * by a {@link DynamicInt32}; As an example, the following is equal to {@code
      * DynamicFloat.constant(2f)}
      *
@@ -4866,7 +5355,7 @@
   }
 
   /**
-   * A static interpolation, between two fixed color values.
+   * A static interpolation node, between two fixed color values.
    *
    * @since 1.2
    */
@@ -4906,9 +5395,9 @@
      * @since 1.2
      */
     @Nullable
-    public AnimationSpec getSpec() {
-      if (mImpl.hasSpec()) {
-        return AnimationSpec.fromProto(mImpl.getSpec());
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
       } else {
         return null;
       }
@@ -4948,8 +5437,8 @@
           + getFromArgb()
           + ", toArgb="
           + getToArgb()
-          + ", spec="
-          + getSpec()
+          + ", animationSpec="
+          + getAnimationSpec()
           + "}";
     }
 
@@ -4991,10 +5480,10 @@
        * @since 1.2
        */
       @NonNull
-      public Builder setSpec(@NonNull AnimationSpec spec) {
-        mImpl.setSpec(spec.toProto());
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
         mFingerprint.recordPropertyUpdate(
-            3, checkNotNull(spec.getFingerprint()).aggregateValueAsInt());
+            3, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
         return this;
       }
 
@@ -5047,9 +5536,9 @@
      * @since 1.2
      */
     @Nullable
-    public AnimationSpec getSpec() {
-      if (mImpl.hasSpec()) {
-        return AnimationSpec.fromProto(mImpl.getSpec());
+    public AnimationSpec getAnimationSpec() {
+      if (mImpl.hasAnimationSpec()) {
+        return AnimationSpec.fromProto(mImpl.getAnimationSpec());
       } else {
         return null;
       }
@@ -5084,7 +5573,12 @@
     @Override
     @NonNull
     public String toString() {
-      return "AnimatableDynamicColor{" + "input=" + getInput() + ", spec=" + getSpec() + "}";
+      return "AnimatableDynamicColor{"
+          + "input="
+          + getInput()
+          + ", animationSpec="
+          + getAnimationSpec()
+          + "}";
     }
 
     /** Builder for {@link AnimatableDynamicColor}. */
@@ -5114,10 +5608,10 @@
        * @since 1.2
        */
       @NonNull
-      public Builder setSpec(@NonNull AnimationSpec spec) {
-        mImpl.setSpec(spec.toProto());
+      public Builder setAnimationSpec(@NonNull AnimationSpec animationSpec) {
+        mImpl.setAnimationSpec(animationSpec.toProto());
         mFingerprint.recordPropertyUpdate(
-            3, checkNotNull(spec.getFingerprint()).aggregateValueAsInt());
+            3, checkNotNull(animationSpec.getFingerprint()).aggregateValueAsInt());
         return this;
       }
 
@@ -5200,15 +5694,15 @@
      *
      * @param start The start value of the range.
      * @param end The end value of the range.
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
     static DynamicColor animate(
-        @ColorInt int start, @ColorInt int end, @NonNull AnimationSpec spec) {
+        @ColorInt int start, @ColorInt int end, @NonNull AnimationSpec animationSpec) {
       return new AnimatableFixedColor.Builder()
           .setFromArgb(start)
           .setToArgb(end)
-          .setSpec(spec)
+          .setAnimationSpec(animationSpec)
           .build();
     }
 
@@ -5217,7 +5711,7 @@
      * the state value changes, this {@link DynamicColor} will animate from its current value to the
      * new value (from the state).
      *
-     * @param stateKey The key to a {@link StateEntryValue} with a color value from the providers
+     * @param stateKey The key to a {@link StateEntryValue} with a color value from the provider's
      *     state.
      */
     @NonNull
@@ -5230,15 +5724,15 @@
      * the state value changes, this {@link DynamicColor} will animate from its current value to the
      * new value (from the state).
      *
-     * @param stateKey The key to a {@link StateEntryValue} with a color value from the providers
+     * @param stateKey The key to a {@link StateEntryValue} with a color value from the provider's
      *     state.
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
-    static DynamicColor animate(@NonNull String stateKey, @NonNull AnimationSpec spec) {
+    static DynamicColor animate(@NonNull String stateKey, @NonNull AnimationSpec animationSpec) {
       return new AnimatableDynamicColor.Builder()
           .setInput(fromState(stateKey))
-          .setSpec(spec)
+          .setAnimationSpec(animationSpec)
           .build();
     }
 
@@ -5246,11 +5740,14 @@
      * Returns a {@link DynamicColor} that is bound to the value of this {@link DynamicColor} and
      * every time its value is changing, it animates from its current value to the new value.
      *
-     * @param spec The animation parameters.
+     * @param animationSpec The animation parameters.
      */
     @NonNull
-    default DynamicColor animate(@NonNull AnimationSpec spec) {
-      return new AnimatableDynamicColor.Builder().setInput(this).setSpec(spec).build();
+    default DynamicColor animate(@NonNull AnimationSpec animationSpec) {
+      return new AnimatableDynamicColor.Builder()
+          .setInput(this)
+          .setAnimationSpec(animationSpec)
+          .build();
     }
 
     /**
@@ -5310,6 +5807,677 @@
   }
 
   /**
+   * A dynamic time instant that sources its value from the platform.
+   *
+   * @since 1.2
+   */
+  static final class PlatformTimeSource implements DynamicInstant {
+    private final DynamicProto.PlatformTimeSource mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    PlatformTimeSource(DynamicProto.PlatformTimeSource impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static PlatformTimeSource fromProto(@NonNull DynamicProto.PlatformTimeSource proto) {
+      return new PlatformTimeSource(proto, null);
+    }
+
+    @NonNull
+    DynamicProto.PlatformTimeSource toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicInstant toDynamicInstantProto() {
+      return DynamicProto.DynamicInstant.newBuilder().setPlatformSource(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "PlatformTimeSource";
+    }
+
+    /** Builder for {@link PlatformTimeSource}. */
+    public static final class Builder implements DynamicInstant.Builder {
+      private final DynamicProto.PlatformTimeSource.Builder mImpl =
+          DynamicProto.PlatformTimeSource.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1895976938);
+
+      public Builder() {}
+
+      @Override
+      @NonNull
+      public PlatformTimeSource build() {
+        return new PlatformTimeSource(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
+   * Interface defining a dynamic time instant type.
+   *
+   * <p> {@link DynamicInstant} precision is seconds. Thus, any time or duration operation will
+   * operate on that precision level.
+   *
+   * @since 1.2
+   */
+  public interface DynamicInstant extends DynamicType {
+    /**
+     * Get the protocol buffer representation of this object.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    DynamicProto.DynamicInstant toDynamicInstantProto();
+
+    /**
+     * Creates a {@link DynamicInstant} from a byte array generated by {@link
+     * #toDynamicInstantByteArray()}.
+     */
+    @NonNull
+    static DynamicInstant fromByteArray(@NonNull byte[] byteArray) {
+      try {
+        return dynamicInstantFromProto(
+            DynamicProto.DynamicInstant.parseFrom(
+                byteArray, ExtensionRegistryLite.getEmptyRegistry()));
+      } catch (InvalidProtocolBufferException e) {
+        throw new IllegalArgumentException("Byte array could not be parsed into DynamicInstant", e);
+      }
+    }
+
+    /** Creates a byte array that can later be used with {@link #fromByteArray(byte[])}. */
+    @NonNull
+    default byte[] toDynamicInstantByteArray() {
+      return toDynamicInstantProto().toByteArray();
+    }
+
+
+    /**
+     * Creates a constant-valued {@link DynamicInstant} from an {@link Instant}. If {@link Instant}
+     * precision is greater than seconds, then any excess precision information will be dropped.
+     */
+    @NonNull
+    static DynamicInstant withSecondsPrecision(@NonNull Instant instant) {
+      return new FixedInstant.Builder().setEpochSeconds(instant.getEpochSecond()).build();
+    }
+
+    /**
+     * Creates a {@link DynamicInstant} that updates its value periodically from the system time.
+     */
+    @NonNull
+    static DynamicInstant platformTimeWithSecondsPrecision() {
+      return new PlatformTimeSource.Builder().build();
+    }
+
+    /**
+     * Returns duration between the two {@link DynamicInstant} instances as a {@link
+     * DynamicDuration}. The resulted duration is inclusive of the start instant and exclusive of
+     * the end; As an example, the following expression yields a duration object representing 10
+     * seconds:
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(10L))
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(20L)));
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicDuration} containing the result of the operation.
+     */
+    @NonNull
+    default DynamicDuration durationUntil(@NonNull DynamicInstant to) {
+      return new BetweenDuration.Builder().setStartInclusive(this).setEndExclusive(to).build();
+    }
+
+    /**
+     * Get the fingerprint for this object or null if unknown.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    Fingerprint getFingerprint();
+
+    /**
+     * Builder to create {@link DynamicInstant} objects.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    interface Builder {
+
+      /** Builds an instance with values accumulated in this Builder. */
+      @NonNull
+      DynamicInstant build();
+    }
+  }
+
+  /**
+   * Creates a new wrapper instance from the proto. Intended for testing purposes only. An object
+   * created using this method can't be added to any other wrapper.
+   *
+   * @hide
+   */
+  @RestrictTo(Scope.LIBRARY_GROUP)
+  @NonNull
+  public static DynamicInstant dynamicInstantFromProto(@NonNull DynamicProto.DynamicInstant proto) {
+    if (proto.hasFixed()) {
+      return FixedInstant.fromProto(proto.getFixed());
+    }
+    if (proto.hasPlatformSource()) {
+      return PlatformTimeSource.fromProto(proto.getPlatformSource());
+    }
+    throw new IllegalStateException("Proto was not a recognised instance of DynamicInstant");
+  }
+
+  /**
+   * A dynamic duration type that represents the duration between two dynamic time instants.
+   *
+   * @since 1.2
+   */
+  static final class BetweenDuration implements DynamicDuration {
+    private final DynamicProto.BetweenDuration mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    BetweenDuration(DynamicProto.BetweenDuration impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets the time instant value marking the start of the duration.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public DynamicInstant getStartInclusive() {
+      if (mImpl.hasStartInclusive()) {
+        return DynamicBuilders.dynamicInstantFromProto(mImpl.getStartInclusive());
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Gets the time instant value marking the end of the duration.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public DynamicInstant getEndExclusive() {
+      if (mImpl.hasEndExclusive()) {
+        return DynamicBuilders.dynamicInstantFromProto(mImpl.getEndExclusive());
+      } else {
+        return null;
+      }
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static BetweenDuration fromProto(@NonNull DynamicProto.BetweenDuration proto) {
+      return new BetweenDuration(proto, null);
+    }
+
+    @NonNull
+    DynamicProto.BetweenDuration toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicDuration toDynamicDurationProto() {
+      return DynamicProto.DynamicDuration.newBuilder().setBetween(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "BetweenDuration{"
+          + "startInclusive="
+          + getStartInclusive()
+          + ", endExclusive="
+          + getEndExclusive()
+          + "}";
+    }
+
+    /** Builder for {@link BetweenDuration}. */
+    public static final class Builder implements DynamicDuration.Builder {
+      private final DynamicProto.BetweenDuration.Builder mImpl =
+          DynamicProto.BetweenDuration.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1615230958);
+
+      public Builder() {}
+
+      /**
+       * Sets the time instant value marking the start of the duration.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setStartInclusive(@NonNull DynamicInstant startInclusive) {
+        mImpl.setStartInclusive(startInclusive.toDynamicInstantProto());
+        mFingerprint.recordPropertyUpdate(
+            1, checkNotNull(startInclusive.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      /**
+       * Sets the time instant value marking the end of the duration.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setEndExclusive(@NonNull DynamicInstant endExclusive) {
+        mImpl.setEndExclusive(endExclusive.toDynamicInstantProto());
+        mFingerprint.recordPropertyUpdate(
+            2, checkNotNull(endExclusive.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public BetweenDuration build() {
+        return new BetweenDuration(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
+   * Interface defining a dynamic duration type.
+   *
+   * @since 1.2
+   */
+  public interface DynamicDuration extends DynamicType {
+    /**
+     * Get the protocol buffer representation of this object.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    DynamicProto.DynamicDuration toDynamicDurationProto();
+
+    /**
+     * Creates a {@link DynamicDuration} from a byte array generated by {@link
+     * #toDynamicDurationByteArray()}.
+     */
+    @NonNull
+    static DynamicDuration fromByteArray(@NonNull byte[] byteArray) {
+      try {
+        return dynamicDurationFromProto(
+            DynamicProto.DynamicDuration.parseFrom(
+                byteArray, ExtensionRegistryLite.getEmptyRegistry()));
+      } catch (InvalidProtocolBufferException e) {
+        throw new IllegalArgumentException(
+            "Byte array could not be parsed into DynamicDuration", e);
+      }
+    }
+
+    /** Creates a byte array that can later be used with {@link #fromByteArray(byte[])}. */
+    @NonNull
+    default byte[] toDynamicDurationByteArray() {
+      return toDynamicDurationProto().toByteArray();
+    }
+
+
+    /**
+     * Returns the total number of days in a {@link DynamicDuration} as a {@link DynamicInt32}. The
+     * fraction part of the result will be truncated. This is based on the standard definition of a
+     * day as 24 hours. As an example, the following is equal to {@code DynamicInt32.constant(1)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .toIntDays();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     *     Integer overflow can occur if the result of the operation is larger than {@link
+     *     Integer#MAX_VALUE}.
+     */
+    @NonNull
+    default DynamicInt32 toIntDays() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_TOTAL_DAYS)
+          .build();
+    }
+
+    /**
+     * Returns the total number of hours in a {@link DynamicDuration} as a {@link DynamicInt32}. The
+     * fraction part of the result will be truncated. As an example, the following is equal to
+     * {@code DynamicInt32.constant(34)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .toIntHours();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     *     Integer overflow can occur if the result of the operation is larger than {@link
+     *     Integer#MAX_VALUE}.
+     */
+    @NonNull
+    default DynamicInt32 toIntHours() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_TOTAL_HOURS)
+          .build();
+    }
+
+    /**
+     * Returns the total number of minutes in a {@link DynamicDuration} as a {@link DynamicInt32}.
+     * The fraction part of the result will be truncated. As an example, the following is equal to
+     * {@code DynamicInt32.constant(2057)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .toIntMinutes();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     *     Integer overflow can occur if the result of the operation is larger than {@link
+     *     Integer#MAX_VALUE}.
+     */
+    @NonNull
+    default DynamicInt32 toIntMinutes() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_TOTAL_MINUTES)
+          .build();
+    }
+
+    /**
+     * Returns the total number of seconds in a {@link DynamicDuration} as a {@link DynamicInt32}.
+     * As an example, the following is equal to {@code DynamicInt32.constant(123456)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .toIntSeconds();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     *     Integer overflow can occur if the result of the operation is larger than {@link
+     *     Integer#MAX_VALUE}.
+     */
+    @NonNull
+    default DynamicInt32 toIntSeconds() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_TOTAL_SECONDS)
+          .build();
+    }
+
+    /**
+     * Returns the total number of days in a duration as a {@link DynamicInt32}. This represents the
+     * absolute value of the total number of days in the duration based on the 24 hours day
+     * definition. The fraction part of the result will be truncated; As an example, the following
+     * is equal to {@code DynamicInt32.constant(1)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .getIntDaysPart();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     *     Integer overflow can occur if the result of the operation is larger than {@link
+     *     Integer#MAX_VALUE}.
+     */
+    @NonNull
+    default DynamicInt32 getIntDaysPart() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_DAYS)
+          .build();
+    }
+
+    /**
+     * Returns the number of hours part in the duration as a {@link DynamicInt32}. This represents
+     * the absolute value of remaining hours when dividing total hours by hours in a day (24 hours);
+     * As an example, the following is equal to {@code DynamicInt32.constant(10)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .getHoursPart();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     */
+    @NonNull
+    default DynamicInt32 getHoursPart() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_HOURS)
+          .build();
+    }
+
+    /**
+     * Returns the number of minutes part in the duration as a {@link DynamicInt32}. This represents
+     * the absolute value of remaining minutes when dividing total minutes by minutes in an hour (60
+     * minutes). As an example, the following is equal to {@code DynamicInt32.constant(17)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .getMinutesPart();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     */
+    @NonNull
+    default DynamicInt32 getMinutesPart() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_MINUTES)
+          .build();
+    }
+
+    /**
+     * Returns the number of seconds part in the duration as a {@link DynamicInt32}. This represents
+     * the absolute value of remaining seconds when dividing total seconds by seconds in a minute
+     * (60 seconds); As an example, the following is equal to {@code DynamicInt32.constant(36)}
+     *
+     * <pre>
+     *   DynamicInstant.withSecondsPrecision(Instant.EPOCH)
+     *      .durationUntil(DynamicInstant.withSecondsPrecision(Instant.ofEpochSecond(123456L)))
+     *      .getSecondsPart();
+     * </pre>
+     *
+     * @return a new instance of {@link DynamicInt32} containing the result of the operation.
+     */
+    @NonNull
+    default DynamicInt32 getSecondsPart() {
+      return new GetDurationPartOp.Builder()
+          .setInput(this)
+          .setDurationPart(DURATION_PART_TYPE_SECONDS)
+          .build();
+    }
+
+    /**
+     * Get the fingerprint for this object or null if unknown.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    Fingerprint getFingerprint();
+
+    /**
+     * Builder to create {@link DynamicDuration} objects.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    interface Builder {
+
+      /** Builds an instance with values accumulated in this Builder. */
+      @NonNull
+      DynamicDuration build();
+    }
+  }
+
+  /**
+   * Creates a new wrapper instance from the proto. Intended for testing purposes only. An object
+   * created using this method can't be added to any other wrapper.
+   *
+   * @hide
+   */
+  @RestrictTo(Scope.LIBRARY_GROUP)
+  @NonNull
+  public static DynamicDuration dynamicDurationFromProto(
+      @NonNull DynamicProto.DynamicDuration proto) {
+    if (proto.hasBetween()) {
+      return BetweenDuration.fromProto(proto.getBetween());
+    }
+    throw new IllegalStateException("Proto was not a recognised instance of DynamicDuration");
+  }
+
+  /**
+   * Retrieve the specified duration part of a {@link DynamicDuration} instance as a {@link
+   * DynamicInt32}.
+   *
+   * @since 1.2
+   */
+  static final class GetDurationPartOp implements DynamicInt32 {
+    private final DynamicProto.GetDurationPartOp mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    GetDurationPartOp(DynamicProto.GetDurationPartOp impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets the duration input.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public DynamicDuration getInput() {
+      if (mImpl.hasInput()) {
+        return DynamicBuilders.dynamicDurationFromProto(mImpl.getInput());
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Gets the duration part to retrieve.
+     *
+     * @since 1.2
+     */
+    @DurationPartType
+    public int getDurationPart() {
+      return mImpl.getDurationPart().getNumber();
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static GetDurationPartOp fromProto(@NonNull DynamicProto.GetDurationPartOp proto) {
+      return new GetDurationPartOp(proto, null);
+    }
+
+    @NonNull
+    DynamicProto.GetDurationPartOp toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicInt32 toDynamicInt32Proto() {
+      return DynamicProto.DynamicInt32.newBuilder().setDurationPart(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "GetDurationPartOp{"
+          + "input="
+          + getInput()
+          + ", durationPart="
+          + getDurationPart()
+          + "}";
+    }
+
+    /** Builder for {@link GetDurationPartOp}. */
+    public static final class Builder implements DynamicInt32.Builder {
+      private final DynamicProto.GetDurationPartOp.Builder mImpl =
+          DynamicProto.GetDurationPartOp.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-225941123);
+
+      public Builder() {}
+
+      /**
+       * Sets the duration input.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setInput(@NonNull DynamicDuration input) {
+        mImpl.setInput(input.toDynamicDurationProto());
+        mFingerprint.recordPropertyUpdate(
+            1, checkNotNull(input.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      /**
+       * Sets the duration part to retrieve.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setDurationPart(@DurationPartType int durationPart) {
+        mImpl.setDurationPart(DynamicProto.DurationPartType.forNumber(durationPart));
+        mFingerprint.recordPropertyUpdate(2, durationPart);
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public GetDurationPartOp build() {
+        return new GetDurationPartOp(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
    * Interface to be used as a base type for all other dynamic types. This is not consumed by any
    * Tile elements, it exists just as a marker interface for use internally in the Tiles library.
    */
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/FixedValueBuilders.java b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/FixedValueBuilders.java
index 4ca0ed2..7320b75 100644
--- a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/FixedValueBuilders.java
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/FixedValueBuilders.java
@@ -49,7 +49,7 @@
     }
 
     /**
-     * Gets the value. Intended for testing purposes only.
+     * Gets the value.
      *
      * @since 1.2
      */
@@ -499,4 +499,86 @@
       }
     }
   }
+
+  /**
+   * A fixed time instant type.
+   *
+   * @since 1.2
+   */
+  static final class FixedInstant implements DynamicBuilders.DynamicInstant {
+    private final FixedProto.FixedInstant mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    FixedInstant(FixedProto.FixedInstant impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970.
+     *
+     * @since 1.2
+     */
+    public long getEpochSeconds() {
+      return mImpl.getEpochSeconds();
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static FixedInstant fromProto(@NonNull FixedProto.FixedInstant proto) {
+      return new FixedInstant(proto, null);
+    }
+
+    @NonNull
+    FixedProto.FixedInstant toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public DynamicProto.DynamicInstant toDynamicInstantProto() {
+      return DynamicProto.DynamicInstant.newBuilder().setFixed(mImpl).build();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "FixedInstant{" + "epochSeconds=" + getEpochSeconds() + "}";
+    }
+
+    /** Builder for {@link FixedInstant}. */
+    public static final class Builder implements DynamicBuilders.DynamicInstant.Builder {
+      private final FixedProto.FixedInstant.Builder mImpl = FixedProto.FixedInstant.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1986552556);
+
+      public Builder() {}
+
+      /**
+       * Sets the number of seconds that have elapsed since 00:00:00 UTC on 1 January 1970.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setEpochSeconds(long epochSeconds) {
+        mImpl.setEpochSeconds(epochSeconds);
+        mFingerprint.recordPropertyUpdate(1, Long.hashCode(epochSeconds));
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public FixedInstant build() {
+        return new FixedInstant(mImpl.build(), mFingerprint);
+      }
+    }
+  }
 }
diff --git a/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/VersionBuilders.java b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/VersionBuilders.java
new file mode 100644
index 0000000..366e97c
--- /dev/null
+++ b/wear/protolayout/protolayout-expression/src/main/java/androidx/wear/protolayout/expression/VersionBuilders.java
@@ -0,0 +1,155 @@
+/*
+ * 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;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.wear.protolayout.expression.proto.VersionProto;
+
+/** Builders for the schema version information of a layout (or an expression). */
+public final class VersionBuilders {
+  private VersionBuilders() {}
+
+  /**
+   * Version information. This is used to encode the schema version of a payload (e.g. inside of a
+   * layout).
+   *
+   * @since 1.0
+   */
+  public static final class VersionInfo {
+    private final VersionProto.VersionInfo mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    VersionInfo(VersionProto.VersionInfo impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets major version. Incremented on breaking changes (i.e. compatibility is not guaranteed
+     * across major versions).
+     *
+     * @since 1.0
+     */
+    public int getMajor() {
+      return mImpl.getMajor();
+    }
+
+    /**
+     * Gets minor version. Incremented on non-breaking changes (e.g. schema additions). Anything
+     * consuming a payload can safely consume anything with a lower minor version.
+     *
+     * @since 1.0
+     */
+    public int getMinor() {
+      return mImpl.getMinor();
+    }
+
+    /**
+     * Get the fingerprint for this object, or null if unknown.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+    /**
+     * Creates a new wrapper instance from the proto.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public static VersionInfo fromProto(
+        @NonNull VersionProto.VersionInfo proto, @Nullable Fingerprint fingerprint) {
+      return new VersionInfo(proto, fingerprint);
+    }
+
+    /**
+     * Creates a new wrapper instance from the proto. Intended for testing purposes only. An object
+     * created using this method can't be added to any other wrapper.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public static VersionInfo fromProto(@NonNull VersionProto.VersionInfo proto) {
+      return fromProto(proto, null);
+    }
+
+    /**
+     * Returns the internal proto instance.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public VersionProto.VersionInfo toProto() {
+      return mImpl;
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+      return "VersionInfo{" + "major=" + getMajor() + ", minor=" + getMinor() + "}";
+    }
+
+    /** Builder for {@link VersionInfo} */
+    public static final class Builder {
+      private final VersionProto.VersionInfo.Builder mImpl = VersionProto.VersionInfo.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(77091996);
+
+      public Builder() {}
+
+      /**
+       * Sets major version. Incremented on breaking changes (i.e. compatibility is not guaranteed
+       * across major versions).
+       *
+       * @since 1.0
+       */
+      @NonNull
+      public Builder setMajor(int major) {
+        mImpl.setMajor(major);
+        mFingerprint.recordPropertyUpdate(1, major);
+        return this;
+      }
+
+      /**
+       * Sets minor version. Incremented on non-breaking changes (e.g. schema additions). Anything
+       * consuming a payload can safely consume anything with a lower minor version.
+       *
+       * @since 1.0
+       */
+      @NonNull
+      public Builder setMinor(int minor) {
+        mImpl.setMinor(minor);
+        mFingerprint.recordPropertyUpdate(2, minor);
+        return this;
+      }
+
+      /** Builds an instance from accumulated values. */
+      @NonNull
+      public VersionInfo build() {
+        return new VersionInfo(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+}
diff --git a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
index b3d3eda..34e1e00 100644
--- a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
+++ b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicColorTest.java
@@ -74,12 +74,13 @@
     DynamicColor animatedColor = DynamicColor.animate(startColor, endColor);
     DynamicColor animatedColorWithSpec = DynamicColor.animate(startColor, endColor, SPEC);
 
-    assertThat(animatedColor.toDynamicColorProto().getAnimatableFixed().hasSpec()).isFalse();
+    assertThat(animatedColor.toDynamicColorProto().getAnimatableFixed().hasAnimationSpec())
+         .isFalse();
     assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getFromArgb())
         .isEqualTo(startColor);
     assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getToArgb())
         .isEqualTo(endColor);
-    assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getSpec())
+    assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableFixed().getAnimationSpec())
         .isEqualTo(SPEC.toProto());
   }
 
@@ -93,7 +94,7 @@
                 .toString())
         .isEqualTo(
             "AnimatableFixedColor{"
-                + "fromArgb=1, toArgb=2, spec=AnimationSpec{"
+                + "fromArgb=1, toArgb=2, animationSpec=AnimationSpec{"
                 + "durationMillis=0, delayMillis=0, easing=null, repeatable=null}}");
   }
 
@@ -104,11 +105,13 @@
     DynamicColor animatedColor = DynamicColor.animate(STATE_KEY);
     DynamicColor animatedColorWithSpec = DynamicColor.animate(STATE_KEY, SPEC);
 
-    assertThat(animatedColor.toDynamicColorProto().getAnimatableDynamic().hasSpec()).isFalse();
+    assertThat(animatedColor.toDynamicColorProto().getAnimatableDynamic().hasAnimationSpec())
+        .isFalse();
     assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableDynamic().getInput())
         .isEqualTo(stateColor.toDynamicColorProto());
-    assertThat(animatedColorWithSpec.toDynamicColorProto().getAnimatableDynamic().getSpec())
-        .isEqualTo(SPEC.toProto());
+    assertThat(
+            animatedColorWithSpec.toDynamicColorProto().getAnimatableDynamic().getAnimationSpec()
+    ).isEqualTo(SPEC.toProto());
     assertThat(animatedColor.toDynamicColorProto())
         .isEqualTo(stateColor.animate().toDynamicColorProto());
   }
@@ -121,7 +124,7 @@
                 .toString())
         .isEqualTo(
             "AnimatableDynamicColor{"
-                + "input=StateColorSource{sourceKey=key}, spec=AnimationSpec{"
+                + "input=StateColorSource{sourceKey=key}, animationSpec=AnimationSpec{"
                 + "durationMillis=0, delayMillis=1, easing=null, repeatable=null}}");
   }
 
diff --git a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
index 731406e..dc0344e 100644
--- a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
+++ b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/DynamicFloatTest.java
@@ -153,12 +153,13 @@
     DynamicFloat animatedFloat = DynamicFloat.animate(startFloat, endFloat);
     DynamicFloat animatedFloatWithSpec = DynamicFloat.animate(startFloat, endFloat, SPEC);
 
-    assertThat(animatedFloat.toDynamicFloatProto().getAnimatableFixed().hasSpec()).isFalse();
+    assertThat(animatedFloat.toDynamicFloatProto().getAnimatableFixed().hasAnimationSpec())
+        .isFalse();
     assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getFromValue())
         .isEqualTo(startFloat);
     assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getToValue())
         .isEqualTo(endFloat);
-    assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getSpec())
+    assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableFixed().getAnimationSpec())
         .isEqualTo(SPEC.toProto());
   }
 
@@ -171,7 +172,7 @@
                     new AnimationSpec.Builder().setDelayMillis(0).build())
                 .toString())
         .isEqualTo(
-            "AnimatableFixedFloat{fromValue=1.0, toValue=2.0, spec=AnimationSpec{"
+            "AnimatableFixedFloat{fromValue=1.0, toValue=2.0, animationSpec=AnimationSpec{"
                 + "durationMillis=0, delayMillis=0, easing=null, repeatable=null}}");
   }
 
@@ -182,11 +183,13 @@
     DynamicFloat animatedFloat = DynamicFloat.animate(STATE_KEY);
     DynamicFloat animatedFloatWithSpec = DynamicFloat.animate(STATE_KEY, SPEC);
 
-    assertThat(animatedFloat.toDynamicFloatProto().getAnimatableDynamic().hasSpec()).isFalse();
+    assertThat(animatedFloat.toDynamicFloatProto().getAnimatableDynamic().hasAnimationSpec())
+        .isFalse();
     assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableDynamic().getInput())
         .isEqualTo(stateFloat.toDynamicFloatProto());
-    assertThat(animatedFloatWithSpec.toDynamicFloatProto().getAnimatableDynamic().getSpec())
-        .isEqualTo(SPEC.toProto());
+    assertThat(
+            animatedFloatWithSpec.toDynamicFloatProto().getAnimatableDynamic().getAnimationSpec()
+    ).isEqualTo(SPEC.toProto());
     assertThat(animatedFloat.toDynamicFloatProto())
         .isEqualTo(stateFloat.animate().toDynamicFloatProto());
   }
@@ -199,7 +202,7 @@
                 .toString())
         .isEqualTo(
             "AnimatableDynamicFloat{"
-                + "input=StateFloatSource{sourceKey=key}, spec=AnimationSpec{"
+                + "input=StateFloatSource{sourceKey=key}, animationSpec=AnimationSpec{"
                 + "durationMillis=0, delayMillis=1, easing=null, repeatable=null}}");
   }
 
diff --git a/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/VersionInfoTest.java b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/VersionInfoTest.java
new file mode 100644
index 0000000..f8e4c67
--- /dev/null
+++ b/wear/protolayout/protolayout-expression/src/test/java/androidx/wear/protolayout/expression/VersionInfoTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public final class VersionInfoTest {
+    @Test
+    public void versionInfo() {
+        int major = 10;
+        int minor = 20;
+
+        VersionBuilders.VersionInfo versionInfo =
+                new VersionBuilders.VersionInfo.Builder().setMajor(major).setMinor(minor).build();
+
+
+        assertThat(versionInfo.toProto().getMajor()).isEqualTo(major);
+        assertThat(versionInfo.toProto().getMinor()).isEqualTo(minor);
+    }
+
+}
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/protolayout/protolayout-proto/src/main/proto/device_parameters.proto b/wear/protolayout/protolayout-proto/src/main/proto/device_parameters.proto
index 25c9e37..bcd3063 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/device_parameters.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/device_parameters.proto
@@ -54,7 +54,7 @@
   ScreenShape screen_shape = 5;
 
   // The maximum schema version supported by the current renderer.
-  VersionInfo renderer_schema_version = 6;
+  androidx.wear.protolayout.expression.proto.VersionInfo renderer_schema_version = 6;
 
   // Renderer supported capabilities
   Capabilities capabilities = 8;
diff --git a/wear/protolayout/protolayout-proto/src/main/proto/dynamic.proto b/wear/protolayout/protolayout-proto/src/main/proto/dynamic.proto
index adc7d78..67d6ff8 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/dynamic.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/dynamic.proto
@@ -26,9 +26,6 @@
   // "ACTIVITY_RECOGNITION" permission granted to it. If this permission is not
   // present, this source type will never yield any data.
   PLATFORM_INT32_SOURCE_TYPE_DAILY_STEP_COUNT = 2;
-
-  // The current epoch time in seconds.
-  PLATFORM_INT32_SOURCE_TYPE_EPOCH_TIME_SECONDS = 3;
 }
 
 // A dynamic Int32 which sources its data from some platform data source, e.g.
@@ -132,7 +129,55 @@
   FloatToInt32RoundMode round_mode = 2;
 }
 
+// A static interpolation node, between two fixed int32 values.
+message AnimatableFixedInt32 {
+  // The value to start animating from.
+  int32 from_value = 1;
+
+  // The value to animate to.
+  int32 to_value = 2;
+
+  // The animation parameters for duration, delay, etc.
+  AnimationSpec animation_spec = 3;
+}
+
+// A dynamic interpolation node. This will watch the value of its input and,
+// when the first update arrives, immediately emit that value. On subsequent
+// updates, it will animate between the old and new values.
+//
+// If this node receives an invalid value (e.g. as a result of an upstream node
+// having no value), then it will emit a single invalid value, and forget its
+// "stored" value. The next valid value that arrives is then used as the
+// "first" value again.
+message AnimatableDynamicInt32 {
+  // The value to watch, and animate when it changes.
+  DynamicInt32 input = 1;
+
+  // The animation parameters for duration, delay, etc.
+  AnimationSpec animation_spec = 2;
+}
+
 // A dynamic int32 type.
+//
+// It offers a set of helper methods for creating arithmetic and logical
+// expressions, e.g. {@link #plus(int)}, {@link #times(int)}, {@link #eq(int)},
+// etc. These helper methods produce expression trees based on the order in
+// which they were called in an expression. Thus, no operator precedence rules
+// are applied.
+//
+// <p>For example the following expression is equivalent to {@code result = ((a
+// + b)*c)/d }:
+//
+// ```
+//    a.plus(b).times(c).div(d);
+// ```
+//
+// More complex expressions can be created by nesting expressions. For example
+// the following expression is equivalent to {@code result = (a + b)*(c - d) }:
+//
+// ```
+//    (a.plus(b)).times(c.minus(d));
+// ```
 message DynamicInt32 {
   oneof inner {
     FixedInt32 fixed = 1;
@@ -141,6 +186,9 @@
     StateInt32Source state_source = 4;
     ConditionalInt32Op conditional_op = 5;
     FloatToInt32Op float_to_int = 6;
+    GetDurationPartOp duration_part = 7;
+    AnimatableFixedInt32 animatable_fixed = 8;
+    AnimatableDynamicInt32 animatable_dynamic = 9;
   }
 }
 
@@ -260,7 +308,7 @@
   DynamicInt32 input = 1;
 }
 
-// A static interpolation, between two fixed floating point values.
+// A static interpolation node, between two fixed floating point values.
 message AnimatableFixedFloat {
   // The number to start animating from.
   float from_value = 1;
@@ -269,7 +317,7 @@
   float to_value = 2;
 
   // The animation parameters for duration, delay, etc.
-  AnimationSpec spec = 3;
+  AnimationSpec animation_spec = 3;
 }
 
 // A dynamic interpolation node. This will watch the value of its input and,
@@ -285,10 +333,30 @@
   DynamicFloat input = 1;
 
   // The animation parameters for duration, delay, etc.
-  AnimationSpec spec = 3;
+  AnimationSpec animation_spec = 3;
 }
 
 // A dynamic float type.
+//
+// It offers a set of helper methods for creating arithmetic and logical
+// expressions, e.g. {@link #plus(float)}, {@link #times(float)}, {@link
+// #eq(float)}, etc. These helper methods produce expression trees based on the
+// order in which they were called in an expression. Thus, no operator
+// precedence rules are applied.
+//
+// <p>For example the following expression is equivalent to {@code result = ((a
+// + b)*c)/d }:
+//
+// ```
+//    a.plus(b).times(c).div(d);
+// ```
+//
+// More complex expressions can be created by nesting expressions. For example
+// the following expression is equivalent to {@code result = (a + b)*(c - d) }:
+//
+// ```
+//    (a.plus(b)).times(c.minus(d));
+// ```
 message DynamicFloat {
   oneof inner {
     FixedFloat fixed = 1;
@@ -411,7 +479,7 @@
   string source_key = 1;
 }
 
-// A static interpolation, between two fixed color values.
+// A static interpolation node, between two fixed color values.
 message AnimatableFixedColor {
   // The color value (in ARGB format) to start animating from.
   uint32 from_argb = 1;
@@ -420,7 +488,7 @@
   uint32 to_argb = 2;
 
   // The animation parameters for duration, delay, etc.
-  AnimationSpec spec = 3;
+  AnimationSpec animation_spec = 3;
 }
 
 // A dynamic interpolation node. This will watch the value of its input and,
@@ -436,7 +504,7 @@
   DynamicColor input = 1;
 
   // The animation parameters for duration, delay, etc.
-  AnimationSpec spec = 3;
+  AnimationSpec animation_spec = 3;
 }
 
 // A dynamic color type.
@@ -448,3 +516,86 @@
     AnimatableDynamicColor animatable_dynamic = 4;
   }
 }
+
+// A dynamic time instant that sources its value from the platform.
+message PlatformTimeSource {}
+
+// A dynamic time instant type.
+message DynamicInstant {
+  oneof inner {
+    FixedInstant fixed = 1;
+    PlatformTimeSource platform_source = 2;
+  }
+}
+
+// A dynamic duration type that represents the duration between two dynamic time
+// instants.
+message BetweenDuration {
+  // The time instant value marking the start of the duration.
+  DynamicInstant start_inclusive = 1;
+
+  // The time instant value marking the end of the duration.
+  DynamicInstant end_exclusive = 2;
+}
+
+// A dynamic duration type.
+message DynamicDuration {
+  oneof inner {
+    BetweenDuration between = 1;
+  }
+}
+
+// The duration part to retrieve using GetDurationPartOp.
+enum DurationPartType {
+  // Undefined duration part type.
+  DURATION_PART_TYPE_UNDEFINED = 0;
+
+  // Total number of days in a duration. The fraction part of the result will be
+  // truncated. This is based on the standard definition of a day as 24 hours.
+  // Notice that the duration can be negative, in which case total number of
+  // days will be also negative.
+  DURATION_PART_TYPE_TOTAL_DAYS = 1;
+
+  // Total number of hours in a duration. The fraction part of the result will
+  // be truncated. Notice that the duration can be negative, in which case total
+  // number of hours will be also negative.
+  DURATION_PART_TYPE_TOTAL_HOURS = 2;
+
+  // Total number of minutes in a duration. The fraction part of the result will
+  // be truncated. Notice that the duration can be negative, in which case total
+  // number of minutes will be also negative.
+  DURATION_PART_TYPE_TOTAL_MINUTES = 3;
+
+  // Total number of seconds in a duration. Notice that the duration can be
+  // negative, in which case total number of seconds will be also negative.
+  DURATION_PART_TYPE_TOTAL_SECONDS = 4;
+
+  // Number of days part in the duration. This represents the absolute value of
+  // the total number of days in the duration based on the 24 hours day
+  // definition. The fraction part of the result will be truncated.
+  DURATION_PART_TYPE_DAYS = 5;
+
+  // Number of hours part in the duration. This represents the absolute value of
+  // remaining hours when dividing total hours by hours in a day (24 hours).
+  DURATION_PART_TYPE_HOURS = 6;
+
+  // Number of minutes part in the duration. This represents the absolute value
+  // of remaining minutes when dividing total minutes by minutes in an hour (60
+  // minutes).
+  DURATION_PART_TYPE_MINUTES = 7;
+
+  // Number of seconds part in the duration. This represents the absolute value
+  // of remaining seconds when dividing total seconds by seconds in a minute (60
+  // seconds).
+  DURATION_PART_TYPE_SECONDS = 8;
+}
+
+// Retrieve the specified duration part of a DynamicDuration instance as a
+// DynamicInt32.
+message GetDurationPartOp {
+  // The duration input.
+  DynamicDuration input = 1;
+
+  // The duration part to retrieve.
+  DurationPartType duration_part = 2;
+}
diff --git a/wear/protolayout/protolayout-proto/src/main/proto/fixed.proto b/wear/protolayout/protolayout-proto/src/main/proto/fixed.proto
index f09c002..bc87d47 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/fixed.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/fixed.proto
@@ -36,3 +36,10 @@
   // The color value, in ARGB format.
   uint32 argb = 1;
 }
+
+// A fixed time instant type.
+message FixedInstant {
+  // The number of seconds that have elapsed since 00:00:00 UTC on 1 January
+  // 1970.
+  int64 epoch_seconds = 1;
+}
diff --git a/wear/protolayout/protolayout-proto/src/main/proto/version.proto b/wear/protolayout/protolayout-proto/src/main/proto/version.proto
index 7c581e3..636de02 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/version.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/version.proto
@@ -1,9 +1,9 @@
 // The schema version information of a layout.
 syntax = "proto3";
 
-package androidx.wear.protolayout.proto;
+package androidx.wear.protolayout.expression.proto;
 
-option java_package = "androidx.wear.protolayout.proto";
+option java_package = "androidx.wear.protolayout.expression.proto";
 option java_outer_classname = "VersionProto";
 
 // Version information. This is used to encode the schema version of a payload
diff --git a/wear/protolayout/protolayout/api/current.txt b/wear/protolayout/protolayout/api/current.txt
index 2d0294f..497290d 100644
--- a/wear/protolayout/protolayout/api/current.txt
+++ b/wear/protolayout/protolayout/api/current.txt
@@ -5,6 +5,8 @@
     method public static androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName, java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!>);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidLongExtra longExtra(long);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
@@ -150,6 +152,8 @@
 
   public static final class DeviceParametersBuilders.DeviceParameters {
     method public int getDevicePlatform();
+    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getFontScale();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo getRendererSchemaVersion();
     method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
     method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
     method public int getScreenShape();
@@ -160,6 +164,8 @@
     ctor public DeviceParametersBuilders.DeviceParameters.Builder();
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters build();
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setFontScale(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setRendererSchemaVersion(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
@@ -171,9 +177,7 @@
     method public static androidx.wear.protolayout.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(int);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(float);
-    method public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp expand();
     method public static androidx.wear.protolayout.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method public static androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp wrap();
   }
 
   public static interface DimensionBuilders.ContainerDimension {
@@ -213,14 +217,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.EmProp.Builder setValue(float);
   }
 
-  public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension {
-  }
-
-  public static final class DimensionBuilders.ExpandedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder androidx.wear.protolayout.DimensionBuilders.ImageDimension.Builder {
-    ctor public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp build();
-  }
-
   public static interface DimensionBuilders.ImageDimension {
   }
 
@@ -257,14 +253,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension build();
   }
 
-  public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension {
-  }
-
-  public static final class DimensionBuilders.WrappedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder {
-    ctor public DimensionBuilders.WrappedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp build();
-  }
-
   public final class LayoutElementBuilders {
     field public static final int ARC_ANCHOR_CENTER = 2; // 0x2
     field public static final int ARC_ANCHOR_END = 3; // 0x3
@@ -851,10 +839,26 @@
   }
 
   public final class ResourceBuilders {
+    field public static final int ANIMATED_IMAGE_FORMAT_AVD = 1; // 0x1
+    field public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0; // 0x0
     field public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
     field public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
   }
 
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method @DrawableRes public int getResourceId();
+    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
+  }
+
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
+  }
+
   public static final class ResourceBuilders.AndroidImageResourceByResId {
     method @DrawableRes public int getResourceId();
   }
@@ -865,15 +869,33 @@
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
   }
 
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
+    method @DrawableRes public int getResourceId();
+  }
+
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+  }
+
   public static final class ResourceBuilders.ImageResource {
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId? getAndroidAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId? getAndroidSeekableAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource? getInlineResource();
   }
 
   public static final class ResourceBuilders.ImageResource.Builder {
     ctor public ResourceBuilders.ImageResource.Builder();
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource build();
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidSeekableAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.protolayout.ResourceBuilders.InlineImageResource);
   }
 
@@ -958,6 +980,32 @@
     method public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.protolayout.TimelineBuilders.TimeInterval);
   }
 
+  public final class TriggerBuilders {
+    method public static androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger createOnConditionMetTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+    method public static androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger createOnLoadTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? getTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger.Builder {
+    ctor public TriggerBuilders.OnConditionMetTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger build();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger.Builder setTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger.Builder {
+    ctor public TriggerBuilders.OnLoadTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger build();
+  }
+
+  public static interface TriggerBuilders.Trigger {
+  }
+
   public final class TypeBuilders {
   }
 
diff --git a/wear/protolayout/protolayout/api/public_plus_experimental_current.txt b/wear/protolayout/protolayout/api/public_plus_experimental_current.txt
index 38735dc..0d15cce 100644
--- a/wear/protolayout/protolayout/api/public_plus_experimental_current.txt
+++ b/wear/protolayout/protolayout/api/public_plus_experimental_current.txt
@@ -5,6 +5,8 @@
     method public static androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName, java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!>);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidLongExtra longExtra(long);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
@@ -148,8 +150,21 @@
     field public static final int SCREEN_SHAPE_UNDEFINED = 0; // 0x0
   }
 
+  @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static final class DeviceParametersBuilders.Capabilities {
+    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public long getMinimumFreshnessLimitMillis();
+  }
+
+  public static final class DeviceParametersBuilders.Capabilities.Builder {
+    ctor public DeviceParametersBuilders.Capabilities.Builder();
+    method public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities build();
+    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities.Builder setMinimumFreshnessLimitMillis(long);
+  }
+
   public static final class DeviceParametersBuilders.DeviceParameters {
+    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.DeviceParametersBuilders.Capabilities? getCapabilities();
     method public int getDevicePlatform();
+    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getFontScale();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo getRendererSchemaVersion();
     method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
     method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
     method public int getScreenShape();
@@ -159,7 +174,10 @@
   public static final class DeviceParametersBuilders.DeviceParameters.Builder {
     ctor public DeviceParametersBuilders.DeviceParameters.Builder();
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters build();
+    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setCapabilities(androidx.wear.protolayout.DeviceParametersBuilders.Capabilities);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setFontScale(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setRendererSchemaVersion(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
@@ -171,9 +189,7 @@
     method public static androidx.wear.protolayout.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(int);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(float);
-    method public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp expand();
     method public static androidx.wear.protolayout.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method public static androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp wrap();
   }
 
   public static interface DimensionBuilders.ContainerDimension {
@@ -213,14 +229,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.EmProp.Builder setValue(float);
   }
 
-  public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension {
-  }
-
-  public static final class DimensionBuilders.ExpandedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder androidx.wear.protolayout.DimensionBuilders.ImageDimension.Builder {
-    ctor public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp build();
-  }
-
   public static interface DimensionBuilders.ImageDimension {
   }
 
@@ -257,14 +265,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension build();
   }
 
-  public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension {
-  }
-
-  public static final class DimensionBuilders.WrappedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder {
-    ctor public DimensionBuilders.WrappedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp build();
-  }
-
   public final class LayoutElementBuilders {
     field public static final int ARC_ANCHOR_CENTER = 2; // 0x2
     field public static final int ARC_ANCHOR_END = 3; // 0x3
@@ -867,10 +867,26 @@
   }
 
   public final class ResourceBuilders {
+    field public static final int ANIMATED_IMAGE_FORMAT_AVD = 1; // 0x1
+    field public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0; // 0x0
     field public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
     field public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
   }
 
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method @DrawableRes public int getResourceId();
+    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
+  }
+
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
+  }
+
   public static final class ResourceBuilders.AndroidImageResourceByResId {
     method @DrawableRes public int getResourceId();
   }
@@ -881,15 +897,33 @@
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
   }
 
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
+    method @DrawableRes public int getResourceId();
+  }
+
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+  }
+
   public static final class ResourceBuilders.ImageResource {
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId? getAndroidAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId? getAndroidSeekableAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource? getInlineResource();
   }
 
   public static final class ResourceBuilders.ImageResource.Builder {
     ctor public ResourceBuilders.ImageResource.Builder();
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource build();
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidSeekableAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.protolayout.ResourceBuilders.InlineImageResource);
   }
 
@@ -910,10 +944,8 @@
   }
 
   public static final class ResourceBuilders.Resources {
-    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public static androidx.wear.protolayout.ResourceBuilders.Resources? fromByteArray(byte[]);
     method public java.util.Map<java.lang.String!,androidx.wear.protolayout.ResourceBuilders.ImageResource!> getIdToImageMapping();
     method public String getVersion();
-    method @androidx.wear.protolayout.expression.ProtoLayoutExperimental public byte[] toByteArray();
   }
 
   public static final class ResourceBuilders.Resources.Builder {
@@ -976,6 +1008,32 @@
     method public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.protolayout.TimelineBuilders.TimeInterval);
   }
 
+  public final class TriggerBuilders {
+    method public static androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger createOnConditionMetTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+    method public static androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger createOnLoadTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? getTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger.Builder {
+    ctor public TriggerBuilders.OnConditionMetTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger build();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger.Builder setTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger.Builder {
+    ctor public TriggerBuilders.OnLoadTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger build();
+  }
+
+  public static interface TriggerBuilders.Trigger {
+  }
+
   public final class TypeBuilders {
   }
 
diff --git a/wear/protolayout/protolayout/api/restricted_current.txt b/wear/protolayout/protolayout/api/restricted_current.txt
index 2d0294f..497290d 100644
--- a/wear/protolayout/protolayout/api/restricted_current.txt
+++ b/wear/protolayout/protolayout/api/restricted_current.txt
@@ -5,6 +5,8 @@
     method public static androidx.wear.protolayout.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName);
+    method public static androidx.wear.protolayout.ActionBuilders.LaunchAction launchAction(android.content.ComponentName, java.util.Map<java.lang.String!,androidx.wear.protolayout.ActionBuilders.AndroidExtra!>);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidLongExtra longExtra(long);
     method public static androidx.wear.protolayout.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
@@ -150,6 +152,8 @@
 
   public static final class DeviceParametersBuilders.DeviceParameters {
     method public int getDevicePlatform();
+    method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getFontScale();
+    method public androidx.wear.protolayout.expression.VersionBuilders.VersionInfo getRendererSchemaVersion();
     method @FloatRange(from=0.0, fromInclusive=false, toInclusive=false) public float getScreenDensity();
     method @Dimension(unit=androidx.annotation.Dimension.DP) public int getScreenHeightDp();
     method public int getScreenShape();
@@ -160,6 +164,8 @@
     ctor public DeviceParametersBuilders.DeviceParameters.Builder();
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters build();
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setDevicePlatform(int);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setFontScale(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
+    method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setRendererSchemaVersion(androidx.wear.protolayout.expression.VersionBuilders.VersionInfo);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenDensity(@FloatRange(from=0.0, fromInclusive=false, toInclusive=false) float);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenHeightDp(@Dimension(unit=androidx.annotation.Dimension.DP) int);
     method public androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters.Builder setScreenShape(int);
@@ -171,9 +177,7 @@
     method public static androidx.wear.protolayout.DimensionBuilders.DpProp dp(@Dimension(unit=androidx.annotation.Dimension.DP) float);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(int);
     method public static androidx.wear.protolayout.DimensionBuilders.EmProp em(float);
-    method public static androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp expand();
     method public static androidx.wear.protolayout.DimensionBuilders.SpProp sp(@Dimension(unit=androidx.annotation.Dimension.SP) float);
-    method public static androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp wrap();
   }
 
   public static interface DimensionBuilders.ContainerDimension {
@@ -213,14 +217,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.EmProp.Builder setValue(float);
   }
 
-  public static final class DimensionBuilders.ExpandedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension androidx.wear.protolayout.DimensionBuilders.ImageDimension {
-  }
-
-  public static final class DimensionBuilders.ExpandedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder androidx.wear.protolayout.DimensionBuilders.ImageDimension.Builder {
-    ctor public DimensionBuilders.ExpandedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.ExpandedDimensionProp build();
-  }
-
   public static interface DimensionBuilders.ImageDimension {
   }
 
@@ -257,14 +253,6 @@
     method public androidx.wear.protolayout.DimensionBuilders.SpacerDimension build();
   }
 
-  public static final class DimensionBuilders.WrappedDimensionProp implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension {
-  }
-
-  public static final class DimensionBuilders.WrappedDimensionProp.Builder implements androidx.wear.protolayout.DimensionBuilders.ContainerDimension.Builder {
-    ctor public DimensionBuilders.WrappedDimensionProp.Builder();
-    method public androidx.wear.protolayout.DimensionBuilders.WrappedDimensionProp build();
-  }
-
   public final class LayoutElementBuilders {
     field public static final int ARC_ANCHOR_CENTER = 2; // 0x2
     field public static final int ARC_ANCHOR_END = 3; // 0x3
@@ -851,10 +839,26 @@
   }
 
   public final class ResourceBuilders {
+    field public static final int ANIMATED_IMAGE_FORMAT_AVD = 1; // 0x1
+    field public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0; // 0x0
     field public static final int IMAGE_FORMAT_RGB_565 = 1; // 0x1
     field public static final int IMAGE_FORMAT_UNDEFINED = 0; // 0x0
   }
 
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method @DrawableRes public int getResourceId();
+    method public androidx.wear.protolayout.TriggerBuilders.Trigger? getStartTrigger();
+  }
+
+  public static final class ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder setStartTrigger(androidx.wear.protolayout.TriggerBuilders.Trigger);
+  }
+
   public static final class ResourceBuilders.AndroidImageResourceByResId {
     method @DrawableRes public int getResourceId();
   }
@@ -865,15 +869,33 @@
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId.Builder setResourceId(@DrawableRes int);
   }
 
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId {
+    method public int getAnimatedImageFormat();
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat? getProgress();
+    method @DrawableRes public int getResourceId();
+  }
+
+  public static final class ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder {
+    ctor public ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId build();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setAnimatedImageFormat(int);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setProgress(androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat);
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder setResourceId(@DrawableRes int);
+  }
+
   public static final class ResourceBuilders.ImageResource {
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId? getAndroidAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId? getAndroidResourceByResId();
+    method public androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId? getAndroidSeekableAnimatedResourceByResId();
     method public androidx.wear.protolayout.ResourceBuilders.InlineImageResource? getInlineResource();
   }
 
   public static final class ResourceBuilders.ImageResource.Builder {
     ctor public ResourceBuilders.ImageResource.Builder();
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource build();
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setAndroidSeekableAnimatedResourceByResId(androidx.wear.protolayout.ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId);
     method public androidx.wear.protolayout.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.protolayout.ResourceBuilders.InlineImageResource);
   }
 
@@ -958,6 +980,32 @@
     method public androidx.wear.protolayout.TimelineBuilders.TimelineEntry.Builder setValidity(androidx.wear.protolayout.TimelineBuilders.TimeInterval);
   }
 
+  public final class TriggerBuilders {
+    method public static androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger createOnConditionMetTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+    method public static androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger createOnLoadTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+    method public androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool? getTrigger();
+  }
+
+  public static final class TriggerBuilders.OnConditionMetTrigger.Builder {
+    ctor public TriggerBuilders.OnConditionMetTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger build();
+    method public androidx.wear.protolayout.TriggerBuilders.OnConditionMetTrigger.Builder setTrigger(androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool);
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger implements androidx.wear.protolayout.TriggerBuilders.Trigger {
+  }
+
+  public static final class TriggerBuilders.OnLoadTrigger.Builder {
+    ctor public TriggerBuilders.OnLoadTrigger.Builder();
+    method public androidx.wear.protolayout.TriggerBuilders.OnLoadTrigger build();
+  }
+
+  public static interface TriggerBuilders.Trigger {
+  }
+
   public final class TypeBuilders {
   }
 
diff --git a/wear/protolayout/protolayout/build.gradle b/wear/protolayout/protolayout/build.gradle
index e622d23..0cc935b 100644
--- a/wear/protolayout/protolayout/build.gradle
+++ b/wear/protolayout/protolayout/build.gradle
@@ -41,7 +41,7 @@
     namespace "androidx.wear.protolayout"
 
     defaultConfig {
-        minSdkVersion 25
+        minSdkVersion 26
     }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ActionBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ActionBuilders.java
index 403e493..18e805d 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ActionBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ActionBuilders.java
@@ -19,6 +19,8 @@
 import static androidx.wear.protolayout.expression.Preconditions.checkNotNull;
 
 import android.annotation.SuppressLint;
+
+import android.content.ComponentName;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -67,6 +69,36 @@
     return new AndroidBooleanExtra.Builder().setValue(value).build();
   }
 
+  /** Shortcut for building a {@link LaunchAction}. */
+  @NonNull
+  public static LaunchAction launchAction(@NonNull ComponentName activityComponentName) {
+    return new LaunchAction.Builder()
+        .setAndroidActivity(
+            new AndroidActivity.Builder()
+                .setClassName(activityComponentName.getClassName())
+                .setPackageName(activityComponentName.getPackageName())
+                .build())
+        .build();
+  }
+
+  /** Shortcut for building a {@link LaunchAction} with extras in the launch intent. */
+  @NonNull
+  public static LaunchAction launchAction(
+          @NonNull ComponentName activityComponentName,
+          @NonNull Map<String, AndroidExtra> intentExtras) {
+    AndroidActivity.Builder builder = new AndroidActivity.Builder();
+    for (Map.Entry<String, AndroidExtra> intentExtra : intentExtras.entrySet()) {
+      builder.addKeyToExtraMapping(intentExtra.getKey(), intentExtra.getValue());
+    }
+    return new LaunchAction.Builder()
+            .setAndroidActivity(
+                    builder
+                            .setClassName(activityComponentName.getClassName())
+                            .setPackageName(activityComponentName.getPackageName())
+                            .build())
+            .build();
+  }
+
   /**
    * A string value that can be added to an Android intent's extras.
    *
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DeviceParametersBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DeviceParametersBuilders.java
index b46c5a4..0843f24 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DeviceParametersBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DeviceParametersBuilders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2022 The Android Open Source Project
+ * 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.
@@ -22,18 +22,23 @@
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.wear.protolayout.expression.ProtoLayoutExperimental;
+import androidx.wear.protolayout.expression.VersionBuilders.VersionInfo;
 import androidx.wear.protolayout.proto.DeviceParametersProto;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
-/** Builders for request messages used to fetch tiles and resources. */
+/** Builders for request messages used to fetch layouts and resources. */
 public final class DeviceParametersBuilders {
   private DeviceParametersBuilders() {}
 
   /**
-   * The platform of the device requesting a tile.
+   * The platform of the device requesting a layout.
    *
+   * @since 1.0
    * @hide
    */
   @RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -41,15 +46,24 @@
   @Retention(RetentionPolicy.SOURCE)
   public @interface DevicePlatform {}
 
-  /** Device platform is undefined. */
+  /**
+   * Device platform is undefined.
+   *
+   * @since 1.0
+   */
   public static final int DEVICE_PLATFORM_UNDEFINED = 0;
 
-  /** Device is a Wear OS device. */
+  /**
+   * Device is a Wear OS device.
+   *
+   * @since 1.0
+   */
   public static final int DEVICE_PLATFORM_WEAR_OS = 1;
 
   /**
    * The shape of a screen.
    *
+   * @since 1.0
    * @hide
    */
   @RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -57,33 +71,55 @@
   @Retention(RetentionPolicy.SOURCE)
   public @interface ScreenShape {}
 
-  /** Screen shape is undefined. */
+  /**
+   * Screen shape is undefined.
+   *
+   * @since 1.0
+   */
   public static final int SCREEN_SHAPE_UNDEFINED = 0;
 
-  /** A round screen (typically found on most Wear devices). */
+  /**
+   * A round screen (typically found on most Wear devices).
+   *
+   * @since 1.0
+   */
   public static final int SCREEN_SHAPE_ROUND = 1;
 
-  /** Rectangular screens. */
+  /**
+   * Rectangular screens.
+   *
+   * @since 1.0
+   */
   public static final int SCREEN_SHAPE_RECT = 2;
 
   /**
-   * Parameters describing the device requesting a tile update. This contains physical and logical
+   * Parameters describing the device requesting a layout update. This contains physical and logical
    * characteristics about the device (e.g. screen size and density, etc).
+   *
+   * @since 1.0
    */
   public static final class DeviceParameters {
     private final DeviceParametersProto.DeviceParameters mImpl;
 
-    private DeviceParameters(DeviceParametersProto.DeviceParameters impl) {
+    DeviceParameters(DeviceParametersProto.DeviceParameters impl) {
       this.mImpl = impl;
     }
 
-    /** Gets width of the device's screen in DP. */
+    /**
+     * Gets width of the device's screen in DP.
+     *
+     * @since 1.0
+     */
     @Dimension(unit = DP)
     public int getScreenWidthDp() {
       return mImpl.getScreenWidthDp();
     }
 
-    /** Gets height of the device's screen in DP. */
+    /**
+     * Gets height of the device's screen in DP.
+     *
+     * @since 1.0
+     */
     @Dimension(unit = DP)
     public int getScreenHeightDp() {
       return mImpl.getScreenHeightDp();
@@ -92,31 +128,97 @@
     /**
      * Gets density of the display. This value is the scaling factor to get from DP to Pixels (px =
      * dp * density).
+     *
+     * @since 1.0
      */
     @FloatRange(from = 0.0, fromInclusive = false, toInclusive = false)
     public float getScreenDensity() {
       return mImpl.getScreenDensity();
     }
 
-    /** Gets the platform of the device. */
+    /**
+     * Gets current user preference for the scaling factor for fonts displayed on the display. This
+     * value is used to get from SP to DP (dp = sp * font_scale).
+     *
+     * @since 1.2
+     */
+    @FloatRange(from = 0.0, fromInclusive = false, toInclusive = false)
+    public float getFontScale() {
+      return mImpl.getFontScale();
+    }
+
+    /**
+     * Gets the platform of the device.
+     *
+     * @since 1.0
+     */
     @DevicePlatform
     public int getDevicePlatform() {
       return mImpl.getDevicePlatform().getNumber();
     }
 
-    /** Gets the shape of the device's screen. */
+    /**
+     * Gets the shape of the device's screen.
+     *
+     * @since 1.0
+     */
     @ScreenShape
     public int getScreenShape() {
       return mImpl.getScreenShape().getNumber();
     }
 
+    /**
+     * Gets the maximum schema version supported by the current renderer. When building a layout
+     * that uses features not available on schema version 1.0 , the result of this method can be
+     * used to conditionally choose which feature to use.
+     *
+     * @since 1.2
+     */
     @NonNull
-    static DeviceParameters fromProto(@NonNull DeviceParametersProto.DeviceParameters proto) {
+    public VersionInfo getRendererSchemaVersion() {
+      if (mImpl.hasRendererSchemaVersion()) {
+        return VersionInfo.fromProto(mImpl.getRendererSchemaVersion());
+      } else {
+        return new VersionInfo.Builder().setMajor(1).setMinor(0).build();
+      }
+    }
+
+    /**
+     * Gets renderer supported {@link Capabilities}.
+     *
+     * @since 1.2
+     */
+    @ProtoLayoutExperimental
+    @Nullable
+    public Capabilities getCapabilities() {
+      if (mImpl.hasCapabilities()) {
+        return Capabilities.fromProto(mImpl.getCapabilities());
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Creates a new wrapper instance from the proto. Intended for testing purposes only. An object
+     * created using this method can't be added to any other wrapper.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public static DeviceParameters fromProto(
+        @NonNull DeviceParametersProto.DeviceParameters proto) {
       return new DeviceParameters(proto);
     }
 
+    /**
+     * Returns the internal proto instance.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
-    DeviceParametersProto.DeviceParameters toProto() {
+    public DeviceParametersProto.DeviceParameters toProto() {
       return mImpl;
     }
 
@@ -127,14 +229,22 @@
 
       public Builder() {}
 
-      /** Sets width of the device's screen in DP. */
+      /**
+       * Sets width of the device's screen in DP.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setScreenWidthDp(@Dimension(unit = DP) int screenWidthDp) {
         mImpl.setScreenWidthDp(screenWidthDp);
         return this;
       }
 
-      /** Sets height of the device's screen in DP. */
+      /**
+       * Sets height of the device's screen in DP.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setScreenHeightDp(@Dimension(unit = DP) int screenHeightDp) {
         mImpl.setScreenHeightDp(screenHeightDp);
@@ -144,6 +254,8 @@
       /**
        * Sets density of the display. This value is the scaling factor to get from DP to Pixels (px
        * = dp * density).
+       *
+       * @since 1.0
        */
       @NonNull
       public Builder setScreenDensity(
@@ -152,20 +264,65 @@
         return this;
       }
 
-      /** Sets the platform of the device. */
+      /**
+       * Sets current user preference for the scaling factor for fonts displayed on the display.
+       * This value is used to get from SP to DP (dp = sp * font_scale).
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setFontScale(
+          @FloatRange(from = 0.0, fromInclusive = false, toInclusive = false) float fontScale) {
+        mImpl.setFontScale(fontScale);
+        return this;
+      }
+
+      /**
+       * Sets the platform of the device.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setDevicePlatform(@DevicePlatform int devicePlatform) {
         mImpl.setDevicePlatform(DeviceParametersProto.DevicePlatform.forNumber(devicePlatform));
         return this;
       }
 
-      /** Sets the shape of the device's screen. */
+      /**
+       * Sets the shape of the device's screen.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setScreenShape(@ScreenShape int screenShape) {
         mImpl.setScreenShape(DeviceParametersProto.ScreenShape.forNumber(screenShape));
         return this;
       }
 
+      /**
+       * Sets the maximum schema version supported by the current renderer. If not set defaults
+       * to schema version 1.0
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setRendererSchemaVersion(@NonNull VersionInfo rendererSchemaVersion) {
+        mImpl.setRendererSchemaVersion(rendererSchemaVersion.toProto());
+        return this;
+      }
+
+      /**
+       * Sets renderer supported {@link Capabilities}.
+       *
+       * @since 1.2
+       */
+      @ProtoLayoutExperimental
+      @NonNull
+      public Builder setCapabilities(@NonNull Capabilities capabilities) {
+        mImpl.setCapabilities(capabilities.toProto());
+        return this;
+      }
+
       /** Builds an instance from accumulated values. */
       @NonNull
       public DeviceParameters build() {
@@ -173,4 +330,71 @@
       }
     }
   }
+
+  /**
+   * {@link Capabilities} describing the features that the renderer supports. These features can
+   * are not necessarily tied to a specific schema version. Layout providers can use these
+   * information to conditionally generate different layouts based on the presence/value of a
+   * feature.
+   *
+   * @since 1.2
+   */
+  @ProtoLayoutExperimental
+  public static final class Capabilities {
+    private final DeviceParametersProto.Capabilities mImpl;
+
+    Capabilities(DeviceParametersProto.Capabilities impl) {
+      this.mImpl = impl;
+    }
+
+    /**
+     * Gets current minimum freshness limit in milliseconds for a layout. This can change based on
+     * various factors. Any freshness request lower than the current limit will be replaced by
+     * that limit. A value of 0 here signifies that the minimum freshness limit in unknown.
+     *
+     * @since 1.2
+     */
+    @ProtoLayoutExperimental
+    public long getMinimumFreshnessLimitMillis() {
+      return mImpl.getMinimumFreshnessLimitMillis();
+    }
+
+    @NonNull
+    static Capabilities fromProto(@NonNull DeviceParametersProto.Capabilities proto) {
+      return new Capabilities(proto);
+    }
+
+    @NonNull
+    DeviceParametersProto.Capabilities toProto() {
+      return mImpl;
+    }
+
+    /** Builder for {@link Capabilities} */
+    public static final class Builder {
+      private final DeviceParametersProto.Capabilities.Builder mImpl =
+          DeviceParametersProto.Capabilities.newBuilder();
+
+      public Builder() {}
+
+      /**
+       * Sets current minimum freshness limit in milliseconds for a layout. This can change based
+       * on various factors. Any freshness request lower than the current limit will be replaced
+       * by that limit. A value of 0 here signifies that the minimum freshness limit in unknown.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      @ProtoLayoutExperimental
+      public Builder setMinimumFreshnessLimitMillis(long minimumFreshnessLimitMillis) {
+        mImpl.setMinimumFreshnessLimitMillis(minimumFreshnessLimitMillis);
+        return this;
+      }
+
+      /** Builds an instance from accumulated values. */
+      @NonNull
+      public Capabilities build() {
+        return Capabilities.fromProto(mImpl.build());
+      }
+    }
+  }
 }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DimensionBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DimensionBuilders.java
index e900f65..0a6f3b0 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DimensionBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/DimensionBuilders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2022 The Android Open Source Project
+ * 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.
@@ -20,8 +20,6 @@
 import static androidx.annotation.Dimension.SP;
 
 import android.annotation.SuppressLint;
-import android.content.Context;
-import android.util.DisplayMetrics;
 import androidx.annotation.Dimension;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
@@ -30,14 +28,12 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.DimensionProto;
+import androidx.wear.protolayout.proto.TypesProto;
 
 /** Builders for dimensions for layout elements. */
 public final class DimensionBuilders {
   private DimensionBuilders() {}
 
-  private static final ExpandedDimensionProp EXPAND = new ExpandedDimensionProp.Builder().build();
-  private static final WrappedDimensionProp WRAP = new WrappedDimensionProp.Builder().build();
-
   /** Shortcut for building a {@link DpProp} using a measurement in DP. */
   @NonNull
   public static DpProp dp(@Dimension(unit = DP) float valueDp) {
@@ -68,25 +64,10 @@
     return new DegreesProp.Builder().setValue(valueDegrees).build();
   }
 
-  /**
-   * Shortcut for building an {@link ExpandedDimensionProp} that will expand to the size of its
-   * parent.
+  /** A type for linear dimensions, measured in dp.
+   *
+   * @since 1.0
    */
-  @NonNull
-  public static ExpandedDimensionProp expand() {
-    return EXPAND;
-  }
-
-  /**
-   * Shortcut for building an {@link WrappedDimensionProp} that will shrink to the size of its
-   * children.
-   */
-  @NonNull
-  public static WrappedDimensionProp wrap() {
-    return WRAP;
-  }
-
-  /** A type for linear dimensions, measured in dp. */
   public static final class DpProp implements ContainerDimension, ImageDimension, SpacerDimension {
     private final DimensionProto.DpProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -96,7 +77,11 @@
       this.mFingerprint = fingerprint;
     }
 
-    /** Gets the value, in dp. Intended for testing purposes only. */
+    /**
+     * Gets the value, in dp.
+     *
+     * @since 1.0
+     */
     @Dimension(unit = DP)
     public float getValue() {
       return mImpl.getValue();
@@ -148,11 +133,15 @@
     public static final class Builder
         implements ContainerDimension.Builder, ImageDimension.Builder, SpacerDimension.Builder {
       private final DimensionProto.DpProp.Builder mImpl = DimensionProto.DpProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(752970309);
+      private final Fingerprint mFingerprint = new Fingerprint(756413087);
 
       public Builder() {}
 
-      /** Sets the value, in dp. */
+      /**
+       * Sets the value, in dp.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setValue(@Dimension(unit = DP) float value) {
         mImpl.setValue(value);
@@ -168,7 +157,11 @@
     }
   }
 
-  /** A type for font sizes, measured in sp. */
+  /**
+   * A type for font sizes, measured in sp.
+   *
+   * @since 1.0
+   */
   public static final class SpProp {
     private final DimensionProto.SpProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -178,7 +171,11 @@
       this.mFingerprint = fingerprint;
     }
 
-    /** Gets the value, in sp. Intended for testing purposes only. */
+    /**
+     * Gets the value, in sp.
+     *
+     * @since 1.0
+     */
     @Dimension(unit = SP)
     public float getValue() {
       return mImpl.getValue();
@@ -208,11 +205,15 @@
     /** Builder for {@link SpProp} */
     public static final class Builder {
       private final DimensionProto.SpProp.Builder mImpl = DimensionProto.SpProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(-2144685857);
+      private final Fingerprint mFingerprint = new Fingerprint(631793260);
 
       public Builder() {}
 
-      /** Sets the value, in sp. */
+      /**
+       * Sets the value, in sp.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setValue(@Dimension(unit = SP) float value) {
         mImpl.setValue(value);
@@ -228,7 +229,11 @@
     }
   }
 
-  /** A type for font spacing, measured in em. */
+  /**
+   * A type for font spacing, measured in em.
+   *
+   * @since 1.0
+   */
   public static final class EmProp {
     private final DimensionProto.EmProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -238,7 +243,11 @@
       this.mFingerprint = fingerprint;
     }
 
-    /** Gets the value, in em. Intended for testing purposes only. */
+    /**
+     * Gets the value, in em.
+     *
+     * @since 1.0
+     */
     public float getValue() {
       return mImpl.getValue();
     }
@@ -267,11 +276,15 @@
     /** Builder for {@link EmProp} */
     public static final class Builder {
       private final DimensionProto.EmProp.Builder mImpl = DimensionProto.EmProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(1628313311);
+      private final Fingerprint mFingerprint = new Fingerprint(-659639046);
 
       public Builder() {}
 
-      /** Sets the value, in em. */
+      /**
+       * Sets the value, in em.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setValue(float value) {
         mImpl.setValue(value);
@@ -287,7 +300,11 @@
     }
   }
 
-  /** A type for angular dimensions, measured in degrees. */
+  /**
+   * A type for angular dimensions, measured in degrees.
+   *
+   * @since 1.0
+   */
   public static final class DegreesProp {
     private final DimensionProto.DegreesProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -297,7 +314,11 @@
       this.mFingerprint = fingerprint;
     }
 
-    /** Gets the value, in degrees. Intended for testing purposes only. */
+    /**
+     * Gets the value, in degrees.
+     *
+     * @since 1.0
+     */
     public float getValue() {
       return mImpl.getValue();
     }
@@ -327,11 +348,15 @@
     public static final class Builder {
       private final DimensionProto.DegreesProp.Builder mImpl =
           DimensionProto.DegreesProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(405060347);
+      private final Fingerprint mFingerprint = new Fingerprint(-1927567665);
 
       public Builder() {}
 
-      /** Sets the value, in degrees. */
+      /**
+       * Sets the value, in degrees.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setValue(float value) {
         mImpl.setValue(value);
@@ -349,7 +374,11 @@
 
   /**
    * A type for a dimension that fills all the space it can (i.e. MATCH_PARENT in Android parlance).
+   *
+   * @since 1.0
+   * @hide
    */
+  @RestrictTo(Scope.LIBRARY_GROUP)
   public static final class ExpandedDimensionProp implements ContainerDimension, ImageDimension {
     private final DimensionProto.ExpandedDimensionProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -360,6 +389,19 @@
       this.mFingerprint = fingerprint;
     }
 
+    /**
+     * Gets the layout weight (a dimensionless scalar value) for this element. This will only affect
+     * the width of children of a {@link androidx.wear.protolayout.LayoutElementBuilders.Row} or the
+     * height of children of a {@link androidx.wear.protolayout.LayoutElementBuilders.Column}. By
+     * default, all children have equal weight. Where applicable, the width or height of the element
+     * is proportional to the sum of the weights of its siblings.
+     *
+     * @since 1.2
+     */
+    public float getLayoutWeight() {
+      return mImpl.getLayoutWeight().getValue();
+    }
+
     /** @hide */
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -399,10 +441,27 @@
         implements ContainerDimension.Builder, ImageDimension.Builder {
       private final DimensionProto.ExpandedDimensionProp.Builder mImpl =
           DimensionProto.ExpandedDimensionProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(1053378170);
+      private final Fingerprint mFingerprint = new Fingerprint(-997720604);
 
       public Builder() {}
 
+      /**
+       * Sets the layout weight (a dimensionless scalar value) for this element. This will only
+       * affect the width of children of a {@link
+       * androidx.wear.protolayout.LayoutElementBuilders.Row} or the height of children of a {@link
+       * androidx.wear.protolayout.LayoutElementBuilders.Column}. By default, all children have
+       * equal weight. Where applicable, the width or height of the element is proportional to the
+       * sum of the weights of its siblings.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setLayoutWeight(float layoutWeight) {
+        mImpl.setLayoutWeight(TypesProto.FloatProp.newBuilder().setValue(layoutWeight));
+        mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(layoutWeight));
+        return this;
+      }
+
       @Override
       @NonNull
       public ExpandedDimensionProp build() {
@@ -414,7 +473,11 @@
   /**
    * A type for a dimension that sizes itself to the size of its children (i.e. WRAP_CONTENT in
    * Android parlance).
+   *
+   * @since 1.0
+   * @hide
    */
+  @RestrictTo(Scope.LIBRARY_GROUP)
   public static final class WrappedDimensionProp implements ContainerDimension {
     private final DimensionProto.WrappedDimensionProp mImpl;
     @Nullable private final Fingerprint mFingerprint;
@@ -425,6 +488,16 @@
       this.mFingerprint = fingerprint;
     }
 
+    /**
+     * Gets the minimum size of this dimension. If not set, then there is no minimum size.
+     *
+     * @since 1.2
+     */
+    @Dimension(unit = DP)
+    public float getMinimumSizeDp() {
+      return mImpl.getMinimumSize().getValue();
+    }
+
     /** @hide */
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -455,10 +528,22 @@
     public static final class Builder implements ContainerDimension.Builder {
       private final DimensionProto.WrappedDimensionProp.Builder mImpl =
           DimensionProto.WrappedDimensionProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(-113456542);
+      private final Fingerprint mFingerprint = new Fingerprint(1118918114);
 
       public Builder() {}
 
+      /**
+       * Sets the minimum size of this dimension. If not set, then there is no minimum size.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setMinimumSizeDp(@Dimension(unit = DP) float minimumSize) {
+        mImpl.setMinimumSize(DimensionProto.DpProp.newBuilder().setValue(minimumSize));
+        mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(minimumSize));
+        return this;
+      }
+
       @Override
       @NonNull
       public WrappedDimensionProp build() {
@@ -475,6 +560,8 @@
    * specifying an element's size using common ratios (e.g. width=4, height=3), or to allow an
    * element to be resized proportionally based on the size of an underlying asset (e.g. an 800x600
    * image being added to a smaller container and resized accordingly).
+   *
+   * @since 1.0
    */
   public static final class ProportionalDimensionProp implements ImageDimension {
     private final DimensionProto.ProportionalDimensionProp mImpl;
@@ -487,8 +574,9 @@
     }
 
     /**
-     * Gets the width to be used when calculating the aspect ratio to preserve. Intended for testing
-     * purposes only.
+     * Gets the width to be used when calculating the aspect ratio to preserve.
+     *
+     * @since 1.0
      */
     @IntRange(from = 0)
     public int getAspectRatioWidth() {
@@ -496,8 +584,9 @@
     }
 
     /**
-     * Gets the height to be used when calculating the aspect ratio ratio to preserve. Intended for
-     * testing purposes only.
+     * Gets the height to be used when calculating the aspect ratio ratio to preserve.
+     *
+     * @since 1.0
      */
     @IntRange(from = 0)
     public int getAspectRatioHeight() {
@@ -535,11 +624,15 @@
     public static final class Builder implements ImageDimension.Builder {
       private final DimensionProto.ProportionalDimensionProp.Builder mImpl =
           DimensionProto.ProportionalDimensionProp.newBuilder();
-      private final Fingerprint mFingerprint = new Fingerprint(-2079046835);
+      private final Fingerprint mFingerprint = new Fingerprint(1725027476);
 
       public Builder() {}
 
-      /** Sets the width to be used when calculating the aspect ratio to preserve. */
+      /**
+       * Sets the width to be used when calculating the aspect ratio to preserve.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setAspectRatioWidth(@IntRange(from = 0) int aspectRatioWidth) {
         mImpl.setAspectRatioWidth(aspectRatioWidth);
@@ -547,7 +640,11 @@
         return this;
       }
 
-      /** Sets the height to be used when calculating the aspect ratio ratio to preserve. */
+      /**
+       * Sets the height to be used when calculating the aspect ratio ratio to preserve.
+       *
+       * @since 1.0
+       */
       @NonNull
       public Builder setAspectRatioHeight(@IntRange(from = 0) int aspectRatioHeight) {
         mImpl.setAspectRatioHeight(aspectRatioHeight);
@@ -563,7 +660,11 @@
     }
   }
 
-  /** Interface defining a dimension that can be applied to a container. */
+  /**
+   * Interface defining a dimension that can be applied to a container.
+   *
+   * @since 1.0
+   */
   public interface ContainerDimension {
     /**
      * Get the protocol buffer representation of this object.
@@ -608,7 +709,11 @@
     throw new IllegalStateException("Proto was not a recognised instance of ContainerDimension");
   }
 
-  /** Interface defining a dimension that can be applied to an image. */
+  /**
+   * Interface defining a dimension that can be applied to an image.
+   *
+   * @since 1.0
+   */
   public interface ImageDimension {
     /**
      * Get the protocol buffer representation of this object.
@@ -652,7 +757,11 @@
     throw new IllegalStateException("Proto was not a recognised instance of ImageDimension");
   }
 
-  /** Interface defining a dimension that can be applied to a spacer. */
+  /**
+   * Interface defining a dimension that can be applied to a spacer.
+   *
+   * @since 1.0
+   */
   public interface SpacerDimension {
     /**
      * Get the protocol buffer representation of this object.
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ResourceBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ResourceBuilders.java
index 8e23d72..76dbb60 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ResourceBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ResourceBuilders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2022 The Android Open Source Project
+ * 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.
@@ -19,6 +19,7 @@
 import static androidx.annotation.Dimension.PX;
 
 import android.annotation.SuppressLint;
+
 import androidx.annotation.Dimension;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
@@ -26,10 +27,12 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
-import androidx.wear.protolayout.expression.ProtoLayoutExperimental;
+import androidx.wear.protolayout.TriggerBuilders.Trigger;
+import androidx.wear.protolayout.expression.DynamicBuilders;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat;
 import androidx.wear.protolayout.proto.ResourceProto;
 import androidx.wear.protolayout.protobuf.ByteString;
-import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
@@ -39,376 +42,733 @@
 
 /** Builders for the resources for a layout. */
 public final class ResourceBuilders {
-  private ResourceBuilders() {}
-
-  /**
-   * Format describing the contents of an image data byte array.
-   *
-   * @hide
-   */
-  @RestrictTo(RestrictTo.Scope.LIBRARY)
-  @IntDef({IMAGE_FORMAT_UNDEFINED, IMAGE_FORMAT_RGB_565})
-  @Retention(RetentionPolicy.SOURCE)
-  public @interface ImageFormat {}
-
-  /** An undefined image format. */
-  public static final int IMAGE_FORMAT_UNDEFINED = 0;
-
-  /**
-   * An image format where each pixel is stored on 2 bytes, with red using 5 bits, green using 6
-   * bits and blue using 5 bits of precision.
-   */
-  public static final int IMAGE_FORMAT_RGB_565 = 1;
-
-  /** An image resource which maps to an Android drawable by resource ID. */
-  public static final class AndroidImageResourceByResId {
-    private final ResourceProto.AndroidImageResourceByResId mImpl;
-
-    private AndroidImageResourceByResId(ResourceProto.AndroidImageResourceByResId impl) {
-      this.mImpl = impl;
-    }
+    private ResourceBuilders() {}
 
     /**
-     * Gets the Android resource ID of this image. This must refer to a drawable under R.drawable.
-     * Intended for testing purposes only.
-     */
-    @DrawableRes
-    public int getResourceId() {
-      return mImpl.getResourceId();
-    }
-
-    @NonNull
-    static AndroidImageResourceByResId fromProto(
-        @NonNull ResourceProto.AndroidImageResourceByResId proto) {
-      return new AndroidImageResourceByResId(proto);
-    }
-
-    @NonNull
-    ResourceProto.AndroidImageResourceByResId toProto() {
-      return mImpl;
-    }
-
-    /** Builder for {@link AndroidImageResourceByResId} */
-    public static final class Builder {
-      private final ResourceProto.AndroidImageResourceByResId.Builder mImpl =
-          ResourceProto.AndroidImageResourceByResId.newBuilder();
-
-      public Builder() {}
-
-      /**
-       * Sets the Android resource ID of this image. This must refer to a drawable under R.drawable.
-       */
-      @NonNull
-      public Builder setResourceId(@DrawableRes int resourceId) {
-        mImpl.setResourceId(resourceId);
-        return this;
-      }
-
-      /** Builds an instance from accumulated values. */
-      @NonNull
-      public AndroidImageResourceByResId build() {
-        return AndroidImageResourceByResId.fromProto(mImpl.build());
-      }
-    }
-  }
-
-  /**
-   * An image resource whose data is fully inlined, with no dependency on a system or app resource.
-   */
-  public static final class InlineImageResource {
-    private final ResourceProto.InlineImageResource mImpl;
-
-    private InlineImageResource(ResourceProto.InlineImageResource impl) {
-      this.mImpl = impl;
-    }
-
-    /** Gets the byte array representing the image. Intended for testing purposes only. */
-    @NonNull
-    public byte[] getData() {
-      return mImpl.getData().toByteArray();
-    }
-
-    /**
-     * Gets the native width of the image, in pixels. Only required for formats (e.g.
-     * IMAGE_FORMAT_RGB_565) where the image data does not include size. Intended for testing
-     * purposes only.
-     */
-    @Dimension(unit = PX)
-    public int getWidthPx() {
-      return mImpl.getWidthPx();
-    }
-
-    /**
-     * Gets the native height of the image, in pixels. Only required for formats (e.g.
-     * IMAGE_FORMAT_RGB_565) where the image data does not include size. Intended for testing
-     * purposes only.
-     */
-    @Dimension(unit = PX)
-    public int getHeightPx() {
-      return mImpl.getHeightPx();
-    }
-
-    /**
-     * Gets the format of the byte array data representing the image. May be left unspecified or set
-     * to IMAGE_FORMAT_UNDEFINED in which case the platform will attempt to extract this from the
-     * raw image data. If the platform does not support the format, the image will not be decoded or
-     * displayed. Intended for testing purposes only.
-     */
-    @ImageFormat
-    public int getFormat() {
-      return mImpl.getFormat().getNumber();
-    }
-
-    @NonNull
-    static InlineImageResource fromProto(@NonNull ResourceProto.InlineImageResource proto) {
-      return new InlineImageResource(proto);
-    }
-
-    @NonNull
-    ResourceProto.InlineImageResource toProto() {
-      return mImpl;
-    }
-
-    /** Builder for {@link InlineImageResource} */
-    public static final class Builder {
-      private final ResourceProto.InlineImageResource.Builder mImpl =
-          ResourceProto.InlineImageResource.newBuilder();
-
-      public Builder() {}
-
-      /** Sets the byte array representing the image. */
-      @NonNull
-      public Builder setData(@NonNull byte[] data) {
-        mImpl.setData(ByteString.copyFrom(data));
-        return this;
-      }
-
-      /**
-       * Sets the native width of the image, in pixels. Only required for formats (e.g.
-       * IMAGE_FORMAT_RGB_565) where the image data does not include size.
-       */
-      @NonNull
-      public Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
-        mImpl.setWidthPx(widthPx);
-        return this;
-      }
-
-      /**
-       * Sets the native height of the image, in pixels. Only required for formats (e.g.
-       * IMAGE_FORMAT_RGB_565) where the image data does not include size.
-       */
-      @NonNull
-      public Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
-        mImpl.setHeightPx(heightPx);
-        return this;
-      }
-
-      /**
-       * Sets the format of the byte array data representing the image. May be left unspecified or
-       * set to IMAGE_FORMAT_UNDEFINED in which case the platform will attempt to extract this from
-       * the raw image data. If the platform does not support the format, the image will not be
-       * decoded or displayed.
-       */
-      @NonNull
-      public Builder setFormat(@ImageFormat int format) {
-        mImpl.setFormat(ResourceProto.ImageFormat.forNumber(format));
-        return this;
-      }
-
-      /** Builds an instance from accumulated values. */
-      @NonNull
-      public InlineImageResource build() {
-        return InlineImageResource.fromProto(mImpl.build());
-      }
-    }
-  }
-
-  /**
-   * An image resource, which can be used by layouts. This holds multiple underlying resource types,
-   * which the underlying runtime will pick according to what it thinks is appropriate.
-   */
-  public static final class ImageResource {
-    private final ResourceProto.ImageResource mImpl;
-
-    private ImageResource(ResourceProto.ImageResource impl) {
-      this.mImpl = impl;
-    }
-
-    /**
-     * Gets an image resource that maps to an Android drawable by resource ID. Intended for testing
-     * purposes only.
-     */
-    @Nullable
-    public AndroidImageResourceByResId getAndroidResourceByResId() {
-      if (mImpl.hasAndroidResourceByResId()) {
-        return AndroidImageResourceByResId.fromProto(mImpl.getAndroidResourceByResId());
-      } else {
-        return null;
-      }
-    }
-
-    /**
-     * Gets an image resource that contains the image data inline. Intended for testing purposes
-     * only.
-     */
-    @Nullable
-    public InlineImageResource getInlineResource() {
-      if (mImpl.hasInlineResource()) {
-        return InlineImageResource.fromProto(mImpl.getInlineResource());
-      } else {
-        return null;
-      }
-    }
-
-    @NonNull
-    static ImageResource fromProto(@NonNull ResourceProto.ImageResource proto) {
-      return new ImageResource(proto);
-    }
-
-    @NonNull
-    ResourceProto.ImageResource toProto() {
-      return mImpl;
-    }
-
-    /** Builder for {@link ImageResource} */
-    public static final class Builder {
-      private final ResourceProto.ImageResource.Builder mImpl =
-          ResourceProto.ImageResource.newBuilder();
-
-      public Builder() {}
-
-      /** Sets an image resource that maps to an Android drawable by resource ID. */
-      @NonNull
-      public Builder setAndroidResourceByResId(
-          @NonNull AndroidImageResourceByResId androidResourceByResId) {
-        mImpl.setAndroidResourceByResId(androidResourceByResId.toProto());
-        return this;
-      }
-
-      /** Sets an image resource that contains the image data inline. */
-      @NonNull
-      public Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
-        mImpl.setInlineResource(inlineResource.toProto());
-        return this;
-      }
-
-      /** Builds an instance from accumulated values. */
-      @NonNull
-      public ImageResource build() {
-        return ImageResource.fromProto(mImpl.build());
-      }
-    }
-  }
-
-  /** The resources for a layout. */
-  public static final class Resources {
-    private final ResourceProto.Resources mImpl;
-
-    private Resources(ResourceProto.Resources impl) {
-      this.mImpl = impl;
-    }
-
-    /**
-     * Gets the version of this {@link Resources} instance.
+     * Format describing the contents of an image data byte array.
      *
-     * <p>Each tile specifies the version of resources it requires. After fetching a tile, the
-     * renderer will use the resources version specified by the tile to separately fetch the
-     * resources.
-     *
-     * <p>This value must match the version of the resources required by the tile for the tile to
-     * render successfully, and must match the resource version specified in {@link
-     * androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request. Intended
-     * for testing purposes only.
-     */
-    @NonNull
-    public String getVersion() {
-      return mImpl.getVersion();
-    }
-
-    /**
-     * Gets a map of resource_ids to images, which can be used by layouts. Intended for testing
-     * purposes only.
-     */
-    @NonNull
-    public Map<String, ImageResource> getIdToImageMapping() {
-      Map<String, ImageResource> map = new HashMap<>();
-      for (Entry<String, ResourceProto.ImageResource> entry : mImpl.getIdToImageMap().entrySet()) {
-        map.put(entry.getKey(), ImageResource.fromProto(entry.getValue()));
-      }
-      return Collections.unmodifiableMap(map);
-    }
-
-    /** Converts to byte array representation. */
-    @NonNull
-    @ProtoLayoutExperimental
-    public byte[] toByteArray() {
-      return mImpl.toByteArray();
-    }
-
-    /** Converts from byte array representation. */
-    @SuppressWarnings("ProtoParseWithRegistry")
-    @Nullable
-    @ProtoLayoutExperimental
-    public static Resources fromByteArray(@NonNull byte[] byteArray) {
-      try {
-        return fromProto(ResourceProto.Resources.parseFrom(byteArray));
-      } catch (InvalidProtocolBufferException e) {
-        return null;
-      }
-    }
-
-    @NonNull
-    static Resources fromProto(@NonNull ResourceProto.Resources proto) {
-      return new Resources(proto);
-    }
-
-    /**
-     * Returns the internal proto instance.
-     *
+     * @since 1.0
      * @hide
      */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public ResourceProto.Resources toProto() {
-      return mImpl;
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({IMAGE_FORMAT_UNDEFINED, IMAGE_FORMAT_RGB_565})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ImageFormat {}
+
+    /**
+     * An undefined image format.
+     *
+     * @since 1.0
+     */
+    public static final int IMAGE_FORMAT_UNDEFINED = 0;
+
+    /**
+     * An image format where each pixel is stored on 2 bytes, with red using 5 bits, green using 6
+     * bits and blue using 5 bits of precision.
+     *
+     * @since 1.0
+     */
+    public static final int IMAGE_FORMAT_RGB_565 = 1;
+
+    /**
+     * Format describing the contents of an animated image.
+     *
+     * @since 1.2
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({ANIMATED_IMAGE_FORMAT_UNDEFINED, ANIMATED_IMAGE_FORMAT_AVD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AnimatedImageFormat {}
+
+    /**
+     * An undefined image format.
+     *
+     * @since 1.2
+     */
+    public static final int ANIMATED_IMAGE_FORMAT_UNDEFINED = 0;
+
+    /**
+     * Android AnimatedVectorDrawable.
+     *
+     * @since 1.2
+     */
+    public static final int ANIMATED_IMAGE_FORMAT_AVD = 1;
+
+    /**
+     * An image resource which maps to an Android drawable by resource ID.
+     *
+     * @since 1.0
+     */
+    public static final class AndroidImageResourceByResId {
+        private final ResourceProto.AndroidImageResourceByResId mImpl;
+
+        AndroidImageResourceByResId(ResourceProto.AndroidImageResourceByResId impl) {
+            this.mImpl = impl;
+        }
+
+        /**
+         * Gets the Android resource ID of this image. This must refer to a drawable under
+         * R.drawable.
+         *
+         * @since 1.0
+         */
+        @DrawableRes
+        public int getResourceId() {
+            return mImpl.getResourceId();
+        }
+
+        @NonNull
+        static AndroidImageResourceByResId fromProto(
+                @NonNull ResourceProto.AndroidImageResourceByResId proto) {
+            return new AndroidImageResourceByResId(proto);
+        }
+
+        @NonNull
+        ResourceProto.AndroidImageResourceByResId toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link AndroidImageResourceByResId} */
+        public static final class Builder {
+            private final ResourceProto.AndroidImageResourceByResId.Builder mImpl =
+                    ResourceProto.AndroidImageResourceByResId.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets the Android resource ID of this image. This must refer to a drawable under
+             * R.drawable.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setResourceId(@DrawableRes int resourceId) {
+                mImpl.setResourceId(resourceId);
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public AndroidImageResourceByResId build() {
+                return AndroidImageResourceByResId.fromProto(mImpl.build());
+            }
+        }
     }
 
-    /** Builder for {@link Resources} */
-    public static final class Builder {
-      private final ResourceProto.Resources.Builder mImpl = ResourceProto.Resources.newBuilder();
+    /**
+     * An image resource whose data is fully inlined, with no dependency on a system or app
+     * resource.
+     *
+     * @since 1.0
+     */
+    public static final class InlineImageResource {
+        private final ResourceProto.InlineImageResource mImpl;
 
-      public Builder() {}
+        InlineImageResource(ResourceProto.InlineImageResource impl) {
+            this.mImpl = impl;
+        }
 
-      /**
-       * Sets the version of this {@link Resources} instance.
-       *
-       * <p>Each tile specifies the version of resources it requires. After fetching a tile, the
-       * renderer will use the resources version specified by the tile to separately fetch the
-       * resources.
-       *
-       * <p>This value must match the version of the resources required by the tile for the tile to
-       * render successfully, and must match the resource version specified in {@link
-       * androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request.
-       */
-      @NonNull
-      public Builder setVersion(@NonNull String version) {
-        mImpl.setVersion(version);
-        return this;
-      }
+        /**
+         * Gets the byte array representing the image.
+         *
+         * @since 1.0
+         */
+        @NonNull
+        public byte[] getData() {
+            return mImpl.getData().toByteArray();
+        }
 
-      /** Adds an entry into a map of resource_ids to images, which can be used by layouts. */
-      @SuppressLint("MissingGetterMatchingBuilder")
-      @NonNull
-      public Builder addIdToImageMapping(@NonNull String id, @NonNull ImageResource image) {
-        mImpl.putIdToImage(id, image.toProto());
-        return this;
-      }
+        /**
+         * Gets the native width of the image, in pixels. Only required for formats (e.g.
+         * IMAGE_FORMAT_RGB_565) where the image data does not include size.
+         *
+         * @since 1.0
+         */
+        @Dimension(unit = PX)
+        public int getWidthPx() {
+            return mImpl.getWidthPx();
+        }
 
-      /** Builds an instance from accumulated values. */
-      @NonNull
-      public Resources build() {
-        return Resources.fromProto(mImpl.build());
-      }
+        /**
+         * Gets the native height of the image, in pixels. Only required for formats (e.g.
+         * IMAGE_FORMAT_RGB_565) where the image data does not include size.
+         *
+         * @since 1.0
+         */
+        @Dimension(unit = PX)
+        public int getHeightPx() {
+            return mImpl.getHeightPx();
+        }
+
+        /**
+         * Gets the format of the byte array data representing the image. May be left unspecified or
+         * set to IMAGE_FORMAT_UNDEFINED in which case the platform will attempt to extract this
+         * from the raw image data. If the platform does not support the format, the image will not
+         * be decoded or displayed.
+         *
+         * @since 1.0
+         */
+        @ImageFormat
+        public int getFormat() {
+            return mImpl.getFormat().getNumber();
+        }
+
+        @NonNull
+        static InlineImageResource fromProto(@NonNull ResourceProto.InlineImageResource proto) {
+            return new InlineImageResource(proto);
+        }
+
+        @NonNull
+        ResourceProto.InlineImageResource toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link InlineImageResource} */
+        public static final class Builder {
+            private final ResourceProto.InlineImageResource.Builder mImpl =
+                    ResourceProto.InlineImageResource.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets the byte array representing the image.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setData(@NonNull byte[] data) {
+                mImpl.setData(ByteString.copyFrom(data));
+                return this;
+            }
+
+            /**
+             * Sets the native width of the image, in pixels. Only required for formats (e.g.
+             * IMAGE_FORMAT_RGB_565) where the image data does not include size.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
+                mImpl.setWidthPx(widthPx);
+                return this;
+            }
+
+            /**
+             * Sets the native height of the image, in pixels. Only required for formats (e.g.
+             * IMAGE_FORMAT_RGB_565) where the image data does not include size.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
+                mImpl.setHeightPx(heightPx);
+                return this;
+            }
+
+            /**
+             * Sets the format of the byte array data representing the image. May be left
+             * unspecified or set to IMAGE_FORMAT_UNDEFINED in which case the platform will attempt
+             * to extract this from the raw image data. If the platform does not support the format,
+             * the image will not be decoded or displayed.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setFormat(@ImageFormat int format) {
+                mImpl.setFormat(ResourceProto.ImageFormat.forNumber(format));
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public InlineImageResource build() {
+                return InlineImageResource.fromProto(mImpl.build());
+            }
+        }
     }
-  }
+
+    /**
+     * A non-seekable animated image resource that maps to an Android drawable by resource ID. The
+     * animation is started with given trigger, fire and forget.
+     *
+     * @since 1.2
+     */
+    public static final class AndroidAnimatedImageResourceByResId {
+        private final ResourceProto.AndroidAnimatedImageResourceByResId mImpl;
+
+        AndroidAnimatedImageResourceByResId(
+                ResourceProto.AndroidAnimatedImageResourceByResId impl) {
+            this.mImpl = impl;
+        }
+
+        /**
+         * Gets the format for the animated image.
+         *
+         * @since 1.2
+         */
+        @AnimatedImageFormat
+        public int getAnimatedImageFormat() {
+            return mImpl.getFormat().getNumber();
+        }
+
+        /**
+         * Gets the Android resource ID, e.g. R.drawable.foo.
+         *
+         * @since 1.2
+         */
+        @DrawableRes
+        public int getResourceId() {
+            return mImpl.getResourceId();
+        }
+
+        /**
+         * Gets the trigger to start the animation.
+         *
+         * @since 1.2
+         */
+        @Nullable
+        public Trigger getStartTrigger() {
+            if (mImpl.hasTrigger()) {
+                return TriggerBuilders.triggerFromProto(mImpl.getTrigger());
+            } else {
+                return null;
+            }
+        }
+
+        @NonNull
+        static AndroidAnimatedImageResourceByResId fromProto(
+                @NonNull ResourceProto.AndroidAnimatedImageResourceByResId proto) {
+            return new AndroidAnimatedImageResourceByResId(proto);
+        }
+
+        @NonNull
+        ResourceProto.AndroidAnimatedImageResourceByResId toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link AndroidAnimatedImageResourceByResId} */
+        public static final class Builder {
+            private final ResourceProto.AndroidAnimatedImageResourceByResId.Builder mImpl =
+                    ResourceProto.AndroidAnimatedImageResourceByResId.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets the format for the animated image.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setAnimatedImageFormat(@AnimatedImageFormat int format) {
+                mImpl.setFormat(ResourceProto.AnimatedImageFormat.forNumber(format));
+                return this;
+            }
+
+            /**
+             * Sets the Android resource ID, e.g. R.drawable.foo.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setResourceId(@DrawableRes int resourceId) {
+                mImpl.setResourceId(resourceId);
+                return this;
+            }
+
+            /**
+             * Sets the trigger to start the animation.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setStartTrigger(@NonNull Trigger trigger) {
+                mImpl.setTrigger(trigger.toTriggerProto());
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public AndroidAnimatedImageResourceByResId build() {
+                return AndroidAnimatedImageResourceByResId.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /**
+     * A seekable animated image resource that maps to an Android drawable by resource ID. The
+     * animation progress is bound to the provided dynamic float.
+     *
+     * @since 1.2
+     */
+    public static final class AndroidSeekableAnimatedImageResourceByResId {
+        private final ResourceProto.AndroidSeekableAnimatedImageResourceByResId mImpl;
+
+        AndroidSeekableAnimatedImageResourceByResId(
+                ResourceProto.AndroidSeekableAnimatedImageResourceByResId impl) {
+            this.mImpl = impl;
+        }
+
+        /**
+         * Gets the format for the animated image.
+         *
+         * @since 1.2
+         */
+        @AnimatedImageFormat
+        public int getAnimatedImageFormat() {
+            return mImpl.getFormat().getNumber();
+        }
+
+        /**
+         * Gets the Android resource ID, e.g. R.drawable.foo.
+         *
+         * @since 1.2
+         */
+        @DrawableRes
+        public int getResourceId() {
+            return mImpl.getResourceId();
+        }
+
+        /**
+         * Gets a {@link DynamicFloat}, normally transformed from certain states with the data
+         * binding pipeline to control the progress of the animation. Its value is required to fall
+         * in the range of [0.0, 1.0]. Any values outside this range would be clamped. When the
+         * first value of the {@link DynamicFloat} arrives, the animation starts from progress 0 to
+         * that value. After that it plays from current progress to the new value on subsequent
+         * updates.
+         * If not set, the animation will play on load (similar to a non-seekable animated).
+         *
+         * @since 1.2
+         */
+        @Nullable
+        public DynamicFloat getProgress() {
+            if (mImpl.hasProgress()) {
+                return DynamicBuilders.dynamicFloatFromProto(mImpl.getProgress());
+            } else {
+                return null;
+            }
+        }
+
+        @NonNull
+        static AndroidSeekableAnimatedImageResourceByResId fromProto(
+                @NonNull ResourceProto.AndroidSeekableAnimatedImageResourceByResId proto) {
+            return new AndroidSeekableAnimatedImageResourceByResId(proto);
+        }
+
+        @NonNull
+        ResourceProto.AndroidSeekableAnimatedImageResourceByResId toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link AndroidSeekableAnimatedImageResourceByResId} */
+        public static final class Builder {
+            private final ResourceProto.AndroidSeekableAnimatedImageResourceByResId.Builder mImpl =
+                    ResourceProto.AndroidSeekableAnimatedImageResourceByResId.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets the format for the animated image.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setAnimatedImageFormat(@AnimatedImageFormat int format) {
+                mImpl.setFormat(ResourceProto.AnimatedImageFormat.forNumber(format));
+                return this;
+            }
+
+            /**
+             * Sets the Android resource ID, e.g. R.drawable.foo.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setResourceId(@DrawableRes int resourceId) {
+                mImpl.setResourceId(resourceId);
+                return this;
+            }
+
+            /**
+             * Sets a {@link DynamicFloat}, normally transformed from certain states with the data
+             * binding pipeline to control the progress of the animation. Its value is required to
+             * fall in the range of [0.0, 1.0]. Any values outside this range would be clamped. When
+             * the first value of the {@link DynamicFloat} arrives, the animation starts from
+             * progress 0 to that value. After that it plays from current progress to the new value
+             * on subsequent updates.
+             * If not set, the animation will play on load (similar to a non-seekable animated).
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setProgress(@NonNull DynamicFloat progress) {
+                mImpl.setProgress(progress.toDynamicFloatProto());
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public AndroidSeekableAnimatedImageResourceByResId build() {
+                return AndroidSeekableAnimatedImageResourceByResId.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /**
+     * An image resource, which can be used by layouts. This holds multiple underlying resource
+     * types, which the underlying runtime will pick according to what it thinks is appropriate.
+     *
+     * @since 1.0
+     */
+    public static final class ImageResource {
+        private final ResourceProto.ImageResource mImpl;
+
+        ImageResource(ResourceProto.ImageResource impl) {
+            this.mImpl = impl;
+        }
+
+        /**
+         * Gets an image resource that maps to an Android drawable by resource ID.
+         *
+         * @since 1.0
+         */
+        @Nullable
+        public AndroidImageResourceByResId getAndroidResourceByResId() {
+            if (mImpl.hasAndroidResourceByResId()) {
+                return AndroidImageResourceByResId.fromProto(mImpl.getAndroidResourceByResId());
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Gets an image resource that contains the image data inline.
+         *
+         * @since 1.0
+         */
+        @Nullable
+        public InlineImageResource getInlineResource() {
+            if (mImpl.hasInlineResource()) {
+                return InlineImageResource.fromProto(mImpl.getInlineResource());
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Gets a non-seekable animated image resource that maps to an Android drawable by resource
+         * ID. The animation is started with given trigger, fire and forget.
+         *
+         * @since 1.2
+         */
+        @Nullable
+        public AndroidAnimatedImageResourceByResId getAndroidAnimatedResourceByResId() {
+            if (mImpl.hasAndroidAnimatedResourceByResId()) {
+                return AndroidAnimatedImageResourceByResId.fromProto(
+                        mImpl.getAndroidAnimatedResourceByResId());
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Gets a seekable animated image resource that maps to an Android drawable by resource ID.
+         * The animation progress is bound to the provided dynamic float.
+         *
+         * @since 1.2
+         */
+        @Nullable
+        public AndroidSeekableAnimatedImageResourceByResId
+                getAndroidSeekableAnimatedResourceByResId() {
+            if (mImpl.hasAndroidSeekableAnimatedResourceByResId()) {
+                return AndroidSeekableAnimatedImageResourceByResId.fromProto(
+                        mImpl.getAndroidSeekableAnimatedResourceByResId());
+            } else {
+                return null;
+            }
+        }
+
+        @NonNull
+        static ImageResource fromProto(@NonNull ResourceProto.ImageResource proto) {
+            return new ImageResource(proto);
+        }
+
+        @NonNull
+        ResourceProto.ImageResource toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link ImageResource} */
+        public static final class Builder {
+            private final ResourceProto.ImageResource.Builder mImpl =
+                    ResourceProto.ImageResource.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets an image resource that maps to an Android drawable by resource ID.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setAndroidResourceByResId(
+                    @NonNull AndroidImageResourceByResId androidResourceByResId) {
+                mImpl.setAndroidResourceByResId(androidResourceByResId.toProto());
+                return this;
+            }
+
+            /**
+             * Sets an image resource that contains the image data inline.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
+                mImpl.setInlineResource(inlineResource.toProto());
+                return this;
+            }
+
+            /**
+             * Sets a non-seekable animated image resource that maps to an Android drawable by
+             * resource ID. The animation is started with given trigger, fire and forget.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setAndroidAnimatedResourceByResId(
+                    @NonNull AndroidAnimatedImageResourceByResId androidAnimatedResourceByResId) {
+                mImpl.setAndroidAnimatedResourceByResId(androidAnimatedResourceByResId.toProto());
+                return this;
+            }
+
+            /**
+             * Sets a seekable animated image resource that maps to an Android drawable by resource
+             * ID. The animation progress is bound to the provided dynamic float.
+             *
+             * @since 1.2
+             */
+            @NonNull
+            public Builder setAndroidSeekableAnimatedResourceByResId(
+                    @NonNull
+                            AndroidSeekableAnimatedImageResourceByResId
+                                    androidSeekableAnimatedResourceByResId) {
+                mImpl.setAndroidSeekableAnimatedResourceByResId(
+                        androidSeekableAnimatedResourceByResId.toProto());
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public ImageResource build() {
+                return ImageResource.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /**
+     * The resources for a layout.
+     *
+     * @since 1.0
+     */
+    public static final class Resources {
+        private final ResourceProto.Resources mImpl;
+
+        Resources(ResourceProto.Resources impl) {
+            this.mImpl = impl;
+        }
+
+        /**
+         * Gets the version of this {@link Resources} instance.
+         *
+         * <p>Each layout specifies the version of resources it requires. After fetching a layout,
+         * the renderer will use the resources version specified by the layout to separately fetch
+         * the resources.
+         *
+         * <p>This value must match the version of the resources required by the layout for the
+         * layout to render successfully, and must match the resource version specified in
+         * ResourcesRequest which triggered this request.
+         *
+         * @since 1.0
+         */
+        @NonNull
+        public String getVersion() {
+            return mImpl.getVersion();
+        }
+
+        /**
+         * Gets a map of resource_ids to images, which can be used by layouts.
+         *
+         * @since 1.0
+         */
+        @NonNull
+        public Map<String, ImageResource> getIdToImageMapping() {
+            Map<String, ImageResource> map = new HashMap<>();
+            for (Entry<String, ResourceProto.ImageResource> entry :
+                    mImpl.getIdToImageMap().entrySet()) {
+                map.put(entry.getKey(), ImageResource.fromProto(entry.getValue()));
+            }
+            return Collections.unmodifiableMap(map);
+        }
+
+        @NonNull
+        static Resources fromProto(@NonNull ResourceProto.Resources proto) {
+            return new Resources(proto);
+        }
+
+        /**
+         * Returns the internal proto instance.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ResourceProto.Resources toProto() {
+            return mImpl;
+        }
+
+        /** Builder for {@link Resources} */
+        public static final class Builder {
+            private final ResourceProto.Resources.Builder mImpl =
+                    ResourceProto.Resources.newBuilder();
+
+            public Builder() {}
+
+            /**
+             * Sets the version of this {@link Resources} instance.
+             *
+             * <p>Each layout specifies the version of resources it requires. After fetching a
+             * layout, the renderer will use the resources version specified by the layout to
+             * separately fetch the resources.
+             *
+             * <p>This value must match the version of the resources required by the layout for the
+             * layout to render successfully, and must match the resource version specified in
+             * ResourcesRequest which triggered this request.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setVersion(@NonNull String version) {
+                mImpl.setVersion(version);
+                return this;
+            }
+
+            /**
+             * Adds an entry into a map of resource_ids to images, which can be used by layouts.
+             *
+             * @since 1.0
+             */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder addIdToImageMapping(@NonNull String id, @NonNull ImageResource image) {
+                mImpl.putIdToImage(id, image.toProto());
+                return this;
+            }
+
+            /** Builds an instance from accumulated values. */
+            @NonNull
+            public Resources build() {
+                return Resources.fromProto(mImpl.build());
+            }
+        }
+    }
 }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/TriggerBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/TriggerBuilders.java
new file mode 100644
index 0000000..675364c
--- /dev/null
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/TriggerBuilders.java
@@ -0,0 +1,237 @@
+/*
+ * 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;
+
+import static androidx.wear.protolayout.expression.Preconditions.checkNotNull;
+
+import android.annotation.SuppressLint;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.wear.protolayout.expression.DynamicBuilders;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool;
+import androidx.wear.protolayout.expression.Fingerprint;
+import androidx.wear.protolayout.proto.TriggerProto;
+
+/** Builders for triggers that can be used to start an animation. */
+public final class TriggerBuilders {
+  private TriggerBuilders() {}
+
+  /** Shortcut for building an {@link OnLoadTrigger}. */
+  @NonNull
+  public static OnLoadTrigger createOnLoadTrigger() {
+    return new OnLoadTrigger.Builder().build();
+  }
+
+  /** Shortcut for building an {@link OnConditionMetTrigger}. */
+  @NonNull
+  public static OnConditionMetTrigger createOnConditionMetTrigger(
+          @NonNull DynamicBool dynamicBool) {
+    return new OnConditionMetTrigger.Builder().setTrigger(dynamicBool).build();
+  }
+
+  /**
+   * Triggers immediately when the layout is loaded / reloaded.
+   *
+   * @since 1.2
+   */
+  public static final class OnLoadTrigger implements Trigger {
+    private final TriggerProto.OnLoadTrigger mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    OnLoadTrigger(TriggerProto.OnLoadTrigger impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static OnLoadTrigger fromProto(@NonNull TriggerProto.OnLoadTrigger proto) {
+      return new OnLoadTrigger(proto, null);
+    }
+
+    @NonNull
+    TriggerProto.OnLoadTrigger toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+      public TriggerProto.Trigger toTriggerProto() {
+      return TriggerProto.Trigger.newBuilder().setOnLoadTrigger(mImpl).build();
+    }
+
+    /** Builder for {@link OnLoadTrigger}. */
+    public static final class Builder implements Trigger.Builder {
+      private final TriggerProto.OnLoadTrigger.Builder mImpl =
+          TriggerProto.OnLoadTrigger.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(-1262805599);
+
+      public Builder() {}
+
+      @Override
+      @NonNull
+      public OnLoadTrigger build() {
+        return new OnLoadTrigger(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
+   * Triggers *every time* the condition switches from false to true. If the condition is true
+   * initially, that will fire the trigger on load.
+   *
+   * @since 1.2
+   */
+  public static final class OnConditionMetTrigger implements Trigger {
+    private final TriggerProto.OnConditionTrigger mImpl;
+    @Nullable private final Fingerprint mFingerprint;
+
+    OnConditionMetTrigger(TriggerProto.OnConditionTrigger impl, @Nullable Fingerprint fingerprint) {
+      this.mImpl = impl;
+      this.mFingerprint = fingerprint;
+    }
+
+    /**
+     * Gets dynamic boolean used as trigger. Intended for testing purposes only.
+     *
+     * @since 1.2
+     */
+    @Nullable
+    public DynamicBool getTrigger() {
+      if (mImpl.hasDynamicBool()) {
+        return DynamicBuilders.dynamicBoolFromProto(mImpl.getDynamicBool());
+      } else {
+        return null;
+      }
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Fingerprint getFingerprint() {
+      return mFingerprint;
+    }
+
+    @NonNull
+    static OnConditionMetTrigger fromProto(@NonNull TriggerProto.OnConditionTrigger proto) {
+      return new OnConditionMetTrigger(proto, null);
+    }
+
+    @NonNull
+    TriggerProto.OnConditionTrigger toProto() {
+      return mImpl;
+    }
+
+    /** @hide */
+    @Override
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+      public TriggerProto.Trigger toTriggerProto() {
+      return TriggerProto.Trigger.newBuilder().setOnConditionTrigger(mImpl).build();
+    }
+
+    /** Builder for {@link OnConditionMetTrigger}. */
+    public static final class Builder implements Trigger.Builder {
+      private final TriggerProto.OnConditionTrigger.Builder mImpl =
+          TriggerProto.OnConditionTrigger.newBuilder();
+      private final Fingerprint mFingerprint = new Fingerprint(1952746052);
+
+      public Builder() {}
+
+      /**
+       * Sets dynamic boolean used as trigger.
+       *
+       * @since 1.2
+       */
+      @NonNull
+      public Builder setTrigger(@NonNull DynamicBool dynamicBool) {
+        mImpl.setDynamicBool(dynamicBool.toDynamicBoolProto());
+        mFingerprint.recordPropertyUpdate(
+            1, checkNotNull(dynamicBool.getFingerprint()).aggregateValueAsInt());
+        return this;
+      }
+
+      @Override
+      @NonNull
+      public OnConditionMetTrigger build() {
+        return new OnConditionMetTrigger(mImpl.build(), mFingerprint);
+      }
+    }
+  }
+
+  /**
+   * Interface defining the triggers that can be fired. These triggers can be used to allow
+   * acting on events. For example some animations can be set to start based on a trigger.
+   *
+   * @since 1.2
+   */
+  public interface Trigger {
+    /**
+     * Get the protocol buffer representation of this object.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    TriggerProto.Trigger toTriggerProto();
+
+    /**
+     * Get the fingerprint for this object or null if unknown.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    Fingerprint getFingerprint();
+
+    /** Builder to create {@link Trigger} objects.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    interface Builder {
+
+      /** Builds an instance with values accumulated in this Builder. */
+      @NonNull
+      Trigger build();
+    }
+  }
+
+  @NonNull
+  static Trigger triggerFromProto(@NonNull TriggerProto.Trigger proto) {
+    if (proto.hasOnLoadTrigger()) {
+      return OnLoadTrigger.fromProto(proto.getOnLoadTrigger());
+    }
+    if (proto.hasOnConditionTrigger()) {
+      return OnConditionMetTrigger.fromProto(proto.getOnConditionTrigger());
+    }
+    throw new IllegalStateException("Proto was not a recognised instance of Trigger");
+  }
+}
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ActionBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ActionBuildersTest.java
index fa3e089..39aa11e 100644
--- a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ActionBuildersTest.java
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ActionBuildersTest.java
@@ -18,14 +18,22 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.ComponentName;
+
 import androidx.wear.protolayout.expression.StateEntryBuilders;
+import androidx.wear.protolayout.proto.ActionProto;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 
+import java.util.Map;
+
 @RunWith(RobolectricTestRunner.class)
 public class ActionBuildersTest {
+    private static final ComponentName LAUNCH_COMPONENT = new ComponentName("com.package",
+            "launchClass");
+
     @Test
     public void setStateAction() {
         String key = "key";
@@ -38,4 +46,40 @@
         assertThat(setStateAction.getValue().toStateEntryValueProto()).isEqualTo(
                 value.toStateEntryValueProto());
     }
+
+    @Test
+    public void launchAction() {
+        ActionBuilders.LaunchAction launchAction = ActionBuilders.launchAction(LAUNCH_COMPONENT);
+
+        ActionProto.LaunchAction launchActionProto = launchAction.toActionProto().getLaunchAction();
+        assertThat(launchActionProto.getAndroidActivity().getPackageName()).isEqualTo(
+                LAUNCH_COMPONENT.getPackageName());
+        assertThat(launchActionProto.getAndroidActivity().getClassName()).isEqualTo(
+                LAUNCH_COMPONENT.getClassName());
+    }
+
+    @Test
+    public void launchActionWithExtras() {
+        String keyString = "keyString";
+        ActionBuilders.AndroidStringExtra stringExtra =
+                new ActionBuilders.AndroidStringExtra.Builder().setValue("string-extra").build();
+        String keyInt = "keyInt";
+        ActionBuilders.AndroidIntExtra intExtra =
+                new ActionBuilders.AndroidIntExtra.Builder().setValue(42).build();
+
+        ActionBuilders.LaunchAction launchAction = ActionBuilders.launchAction(LAUNCH_COMPONENT,
+                Map.of(keyInt, intExtra, keyString, stringExtra));
+
+        ActionProto.LaunchAction launchActionProto = launchAction.toActionProto().getLaunchAction();
+        assertThat(launchActionProto.getAndroidActivity().getPackageName()).isEqualTo(
+                LAUNCH_COMPONENT.getPackageName());
+        assertThat(launchActionProto.getAndroidActivity().getClassName()).isEqualTo(
+                LAUNCH_COMPONENT.getClassName());
+        Map<String, ActionProto.AndroidExtra> keyToExtraMap =
+                launchActionProto.getAndroidActivity().getKeyToExtraMap();
+        assertThat(keyToExtraMap).hasSize(2);
+        assertThat(keyToExtraMap.get(keyString).getStringVal().getValue()).isEqualTo(
+                stringExtra.getValue());
+        assertThat(keyToExtraMap.get(keyInt).getIntVal().getValue()).isEqualTo(intExtra.getValue());
+    }
 }
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DeviceParametersBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DeviceParametersBuildersTest.java
new file mode 100644
index 0000000..44af4fec
--- /dev/null
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DeviceParametersBuildersTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.wear.protolayout.expression.VersionBuilders;
+import androidx.wear.protolayout.proto.DeviceParametersProto;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class DeviceParametersBuildersTest {
+
+    @Test
+    public void deviceParameters() {
+        float fontScale = 0.5f;
+        int major = 1;
+        int minor = 2;
+
+        VersionBuilders.VersionInfo rendererVersion =
+                new VersionBuilders.VersionInfo.Builder().setMajor(major).setMinor(minor).build();
+        DeviceParametersBuilders.DeviceParameters deviceParameters =
+                new DeviceParametersBuilders.DeviceParameters.Builder().setFontScale(
+                        fontScale).setRendererSchemaVersion(rendererVersion).build();
+
+        DeviceParametersProto.DeviceParameters deviceParametersProto = deviceParameters.toProto();
+        assertThat(deviceParametersProto.getFontScale()).isEqualTo(fontScale);
+        assertThat(deviceParametersProto.getRendererSchemaVersion().getMajor()).isEqualTo(major);
+        assertThat(deviceParametersProto.getRendererSchemaVersion().getMinor()).isEqualTo(minor);
+    }
+
+    @Test
+    public void capabilities() {
+        float fontScale = 0.5f;
+
+        DeviceParametersBuilders.DeviceParameters deviceParameters =
+                new DeviceParametersBuilders.DeviceParameters.Builder().setFontScale(
+                        fontScale).build();
+
+        assertThat(deviceParameters.getFontScale()).isEqualTo(fontScale);
+    }
+}
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DimensionBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DimensionBuildersTest.java
new file mode 100644
index 0000000..2f54d7b
--- /dev/null
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/DimensionBuildersTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.wear.protolayout.proto.DimensionProto;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class DimensionBuildersTest {
+
+    @Test
+    public void expandedLayoutWeight() {
+        float layoutWeight = 3.14f;
+        DimensionBuilders.ContainerDimension dimensionProp =
+                new DimensionBuilders.ExpandedDimensionProp.Builder().setLayoutWeight(layoutWeight)
+                        .build();
+
+        DimensionProto.ContainerDimension dimensionProto =
+                dimensionProp.toContainerDimensionProto();
+        assertThat(dimensionProto.getExpandedDimension().getLayoutWeight().getValue())
+                .isWithin(.001f).of(layoutWeight);
+    }
+
+
+    @Test
+    public void wrappedMinSize() {
+        int minSizeDp = 42;
+        DimensionBuilders.ContainerDimension dimensionProp =
+                new DimensionBuilders.WrappedDimensionProp.Builder().setMinimumSizeDp(minSizeDp)
+                        .build();
+
+        DimensionProto.ContainerDimension dimensionProto =
+                dimensionProp.toContainerDimensionProto();
+        assertThat(dimensionProto.getWrappedDimension().getMinimumSize().getValue())
+                .isEqualTo(minSizeDp);
+    }
+}
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ResourceBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ResourceBuildersTest.java
new file mode 100644
index 0000000..59f2df8
--- /dev/null
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/ResourceBuildersTest.java
@@ -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.wear.protolayout;
+
+import static androidx.wear.protolayout.ResourceBuilders.ANIMATED_IMAGE_FORMAT_AVD;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.wear.protolayout.expression.DynamicBuilders;
+import androidx.wear.protolayout.proto.ResourceProto;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class ResourceBuildersTest {
+    private static final int RESOURCE_ID = 10;
+    private static final int FORMAT = ANIMATED_IMAGE_FORMAT_AVD;
+
+    @Test
+    public void avd() {
+        ResourceBuilders.AndroidAnimatedImageResourceByResId avd =
+                new ResourceBuilders.AndroidAnimatedImageResourceByResId.Builder()
+                        .setResourceId(RESOURCE_ID)
+                        .setAnimatedImageFormat(FORMAT)
+                        .setStartTrigger(TriggerBuilders.createOnLoadTrigger())
+                        .build();
+
+        ResourceProto.AndroidAnimatedImageResourceByResId avdProto = avd.toProto();
+
+        assertThat(avdProto.getResourceId()).isEqualTo(RESOURCE_ID);
+        assertThat(avdProto.getFormat().getNumber()).isEqualTo(FORMAT);
+        assertThat(avdProto.getTrigger().hasOnLoadTrigger()).isTrue();
+    }
+
+    @Test
+    public void seekableAvd() {
+        String stateKey = "state-key";
+        ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId avd =
+                new ResourceBuilders.AndroidSeekableAnimatedImageResourceByResId.Builder()
+                        .setResourceId(RESOURCE_ID)
+                        .setAnimatedImageFormat(FORMAT)
+                        .setProgress(DynamicBuilders.DynamicFloat.fromState(stateKey))
+                        .build();
+
+        ResourceProto.AndroidSeekableAnimatedImageResourceByResId avdProto = avd.toProto();
+
+        assertThat(avdProto.getResourceId()).isEqualTo(RESOURCE_ID);
+        assertThat(avdProto.getFormat().getNumber()).isEqualTo(FORMAT);
+        assertThat(avdProto.getProgress().getStateSource().getSourceKey()).isEqualTo(stateKey);
+    }
+}
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/TriggerBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/TriggerBuildersTest.java
new file mode 100644
index 0000000..5b3260e
--- /dev/null
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/TriggerBuildersTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.wear.protolayout.expression.DynamicBuilders;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class TriggerBuildersTest {
+
+    @Test
+    public void onLoadTrigger() {
+        TriggerBuilders.OnLoadTrigger onLoadTrigger = TriggerBuilders.createOnLoadTrigger();
+
+        assertThat(onLoadTrigger.toTriggerProto().hasOnLoadTrigger()).isTrue();
+    }
+
+
+    @Test
+    public void onConditionTrigger() {
+        DynamicBuilders.DynamicBool condition = DynamicBuilders.DynamicBool.fromState("state");
+
+        TriggerBuilders.OnConditionMetTrigger onConditionMetTrigger =
+                TriggerBuilders.createOnConditionMetTrigger(
+                condition);
+
+        assertThat(
+                onConditionMetTrigger.toTriggerProto().getOnConditionTrigger().getDynamicBool())
+                .isEqualTo(condition.toDynamicBoolProto());
+    }
+}
diff --git a/wear/tiles/tiles-proto/src/main/proto/tile.proto b/wear/tiles/tiles-proto/src/main/proto/tile.proto
index fc3d294..4f2b1b6 100644
--- a/wear/tiles/tiles-proto/src/main/proto/tile.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/tile.proto
@@ -22,7 +22,7 @@
   androidx.wear.protolayout.proto.Timeline timeline = 2;
 
   // The schema version that this tile was built with.
-  androidx.wear.protolayout.proto.VersionInfo schema_version = 3;
+  androidx.wear.protolayout.expression.proto.VersionInfo schema_version = 3;
 
   // How many milliseconds of elapsed time (**not** wall clock time) this tile
   // can be considered to be "fresh". The platform will attempt to refresh
diff --git a/wear/tiles/tiles-tooling/api/current.txt b/wear/tiles/tiles-tooling/api/current.txt
index 8eb29b6..e6f50d0 100644
--- a/wear/tiles/tiles-tooling/api/current.txt
+++ b/wear/tiles/tiles-tooling/api/current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.tiles.tooling {
-
-  public final class TileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt b/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt
index 8eb29b6..e6f50d0 100644
--- a/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.tiles.tooling {
-
-  public final class TileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/wear/tiles/tiles-tooling/api/restricted_current.txt b/wear/tiles/tiles-tooling/api/restricted_current.txt
index 8eb29b6..e6f50d0 100644
--- a/wear/tiles/tiles-tooling/api/restricted_current.txt
+++ b/wear/tiles/tiles-tooling/api/restricted_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.tiles.tooling {
-
-  public final class TileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
index dc56dd4..1ad1937 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
@@ -22,7 +22,7 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.tiles.TimelineBuilders.Timeline;
 import androidx.wear.tiles.proto.TileProto;
-import androidx.wear.protolayout.proto.VersionProto.VersionInfo;
+import androidx.wear.protolayout.expression.proto.VersionProto.VersionInfo;
 
 /** Builders for the components of a tile that can be rendered by a tile renderer. */
 public final class TileBuilders {
diff --git a/wear/watchface/watchface-client-guava/api/current.txt b/wear/watchface/watchface-client-guava/api/current.txt
index 4c88746..1b8efee 100644
--- a/wear/watchface/watchface-client-guava/api/current.txt
+++ b/wear/watchface/watchface-client-guava/api/current.txt
@@ -11,9 +11,9 @@
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
     method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
 
diff --git a/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt b/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
index 4c88746..1b8efee 100644
--- a/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client-guava/api/public_plus_experimental_current.txt
@@ -11,9 +11,9 @@
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
     method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
 
diff --git a/wear/watchface/watchface-client-guava/api/restricted_current.txt b/wear/watchface/watchface-client-guava/api/restricted_current.txt
index 4c88746..1b8efee 100644
--- a/wear/watchface/watchface-client-guava/api/restricted_current.txt
+++ b/wear/watchface/watchface-client-guava/api/restricted_current.txt
@@ -11,9 +11,9 @@
     method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
     method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
     method @Deprecated public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
-    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>);
     method @Deprecated public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
-    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener);
     field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
   }
 
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..e3de152 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
@@ -19,20 +19,20 @@
 import android.content.ComponentName
 import android.content.Context
 import androidx.concurrent.futures.ResolvableFuture
+import androidx.core.util.Consumer
 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..04a3c4c 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);
@@ -196,7 +190,7 @@
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
@@ -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..16c73b9 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);
@@ -137,7 +131,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
-    method @androidx.wear.watchface.client.WatchFaceClientExperimental public default void addOnWatchFaceColorsListener(java.util.concurrent.Executor executor, java.util.function.Consumer<androidx.wear.watchface.WatchFaceColors> listener);
+    method @androidx.wear.watchface.client.WatchFaceClientExperimental public default void addOnWatchFaceColorsListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.wear.watchface.WatchFaceColors> listener);
     method public void addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState() throws android.os.RemoteException;
@@ -150,7 +144,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
-    method @androidx.wear.watchface.client.WatchFaceClientExperimental public default void removeOnWatchFaceColorsListener(java.util.function.Consumer<androidx.wear.watchface.WatchFaceColors> listener);
+    method @androidx.wear.watchface.client.WatchFaceClientExperimental public default void removeOnWatchFaceColorsListener(androidx.core.util.Consumer<androidx.wear.watchface.WatchFaceColors> listener);
     method public void removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
     method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
@@ -205,7 +199,7 @@
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
@@ -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..04a3c4c 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);
@@ -196,7 +190,7 @@
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
     method @Deprecated @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
-    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, java.util.function.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default suspend Object? getOrCreateInteractiveWatchFaceClient(String instanceId, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, java.util.concurrent.Executor previewImageUpdateRequestedExecutor, androidx.core.util.Consumer<java.lang.String> previewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) throws android.os.RemoteException;
     method public default boolean hasComplicationDataCache();
     field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
   }
@@ -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..b723da6 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
@@ -34,6 +34,7 @@
 import android.view.SurfaceHolder
 import androidx.annotation.CallSuper
 import androidx.annotation.RequiresApi
+import androidx.core.util.Consumer
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -98,7 +99,6 @@
 import java.util.concurrent.Executor
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.TimeoutException
-import java.util.function.Consumer
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
@@ -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..394bcfa 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.core.util.Consumer
+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..e9177de 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
@@ -23,14 +23,13 @@
 import android.os.IBinder
 import android.os.RemoteException
 import android.util.Log
+import androidx.core.util.Consumer
 import androidx.annotation.Px
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.Renderer
 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 +42,13 @@
 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/api/current.txt b/wear/watchface/watchface-complications-data-source/api/current.txt
index 73e5e61..d348447 100644
--- a/wear/watchface/watchface-complications-data-source/api/current.txt
+++ b/wear/watchface/watchface-complications-data-source/api/current.txt
@@ -52,14 +52,17 @@
   }
 
   public final class ComplicationRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired, Boolean? isForSafeWatchFace);
     ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired);
     ctor @Deprecated public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
     method public int getComplicationInstanceId();
     method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    method public Boolean? isForSafeWatchFace();
     method public boolean isImmediateResponseRequired();
     property public final int complicationInstanceId;
     property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
     property public final boolean immediateResponseRequired;
+    property public final Boolean? isForSafeWatchFace;
   }
 
   public final class TimeInterval {
diff --git a/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_current.txt
index 73e5e61..d348447 100644
--- a/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_current.txt
@@ -52,14 +52,17 @@
   }
 
   public final class ComplicationRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired, Boolean? isForSafeWatchFace);
     ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired);
     ctor @Deprecated public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
     method public int getComplicationInstanceId();
     method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    method public Boolean? isForSafeWatchFace();
     method public boolean isImmediateResponseRequired();
     property public final int complicationInstanceId;
     property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
     property public final boolean immediateResponseRequired;
+    property public final Boolean? isForSafeWatchFace;
   }
 
   public final class TimeInterval {
diff --git a/wear/watchface/watchface-complications-data-source/api/restricted_current.txt b/wear/watchface/watchface-complications-data-source/api/restricted_current.txt
index 73e5e61..d348447 100644
--- a/wear/watchface/watchface-complications-data-source/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications-data-source/api/restricted_current.txt
@@ -52,14 +52,17 @@
   }
 
   public final class ComplicationRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired, Boolean? isForSafeWatchFace);
     ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType, boolean immediateResponseRequired);
     ctor @Deprecated public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
     method public int getComplicationInstanceId();
     method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    method public Boolean? isForSafeWatchFace();
     method public boolean isImmediateResponseRequired();
     property public final int complicationInstanceId;
     property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
     property public final boolean immediateResponseRequired;
+    property public final Boolean? isForSafeWatchFace;
   }
 
   public final class TimeInterval {
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..6197888 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,13 +26,16 @@
 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
 import androidx.annotation.MainThread
+import androidx.annotation.RequiresApi
 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,23 +52,46 @@
 /**
  * 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.
+ * @param isForSafeWatchFace Whether this request is on behalf of a 'safe' watch face as defined by
+ *   the [ComplicationDataSourceService.METADATA_KEY_SAFE_WATCH_FACES] meta data in the data
+ *   source's manifest. The data source may choose to serve different results for a 'safe' watch
+ *   face. If the data source does not have the privileged permission
+ *   `com.google.wear.permission.GET_IS_FOR_SAFE_WATCH_FACE`, then this must be null.
  */
-public class ComplicationRequest(
+public class ComplicationRequest
+@RequiresApi(Build.VERSION_CODES.TIRAMISU)
+constructor(
     complicationInstanceId: Int,
     complicationType: ComplicationType,
-    immediateResponseRequired: Boolean
+    immediateResponseRequired: Boolean,
+    @Suppress("AutoBoxing")
+    isForSafeWatchFace: Boolean?
 ) {
+    /** Constructs a [ComplicationRequest] without setting [isForSafeWatchFace]. */
+    @Suppress("NewApi")
+    constructor(
+        complicationInstanceId: Int,
+        complicationType: ComplicationType,
+        immediateResponseRequired: Boolean,
+    ) : this(
+        complicationInstanceId,
+        complicationType,
+        immediateResponseRequired,
+        isForSafeWatchFace = false
+    )
+
     /**
-     * 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
 
@@ -84,6 +109,23 @@
     @get:JvmName("isImmediateResponseRequired")
     public val immediateResponseRequired = immediateResponseRequired
 
+    /**
+     * Intended for OEM use, returns whether this request is on behalf of a 'safe' watch face as
+     * defined by the [ComplicationDataSourceService.METADATA_KEY_SAFE_WATCH_FACES] meta data in the
+     * data source's manifest. The data source may choose to serve different results for a 'safe'
+     * watch face.
+     *
+     * If the [ComplicationDataSourceService.METADATA_KEY_SAFE_WATCH_FACES] meta data is not defined
+     * then this will be false.
+     *
+     * If the DataSourceService does not have the privileged permission
+     * `com.google.wear.permission.GET_IS_FOR_SAFE_WATCH_FACE`, then this will be null.
+     */
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    @get:JvmName("isForSafeWatchFace")
+    @get:Suppress("AutoBoxing")
+    public val isForSafeWatchFace: Boolean? = isForSafeWatchFace
+
     @Deprecated("Use a constructor that specifies responseNeededSoon.")
     constructor(
         complicationInstanceId: Int,
@@ -98,33 +140,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 +170,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"/>
@@ -144,17 +180,16 @@
  * also register a separate [METADATA_KEY_IMMEDIATE_UPDATE_PERIOD_MILLISECONDS] meta data tag which
  * supports sampling at up to 1Hz when the watch face is visible and non-ambient, however this also
  * requires the DataSourceService to have the privileged permission
- * com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE.
+ * `com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE`.
  *
  * ```
  *   <meta-data android:name=
  *      "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 +212,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 +270,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,15 +283,15 @@
      * 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
-     * com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE, and the
+     * `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.
      *
      * @param request The details about the complication that has been requested.
@@ -302,32 +334,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 +369,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,23 +383,33 @@
      * 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")
         override fun onUpdate(complicationInstanceId: Int, type: Int, manager: IBinder) {
+            onUpdate2(complicationInstanceId, type, isForSafeWatchFace = false, manager)
+        }
+
+        @SuppressLint("SyntheticAccessor")
+        override fun onUpdate2(
+            complicationInstanceId: Int,
+            type: Int,
+            isForSafeWatchFace: Boolean,
+            manager: IBinder
+        ) {
             val expectedDataType = fromWireType(type)
             val iComplicationManager = IComplicationManager.Stub.asInterface(manager)
             mainThreadHandler.post {
                 onComplicationRequest(
+                    @Suppress("NewApi")
                     ComplicationRequest(
                         complicationInstanceId,
                         expectedDataType,
-                        immediateResponseRequired = false
+                        immediateResponseRequired = false,
+                        isForSafeWatchFace = isForSafeWatchFace
                     ),
                     object : ComplicationRequestListener {
                         override fun onComplicationData(complicationData: ComplicationData?) {
@@ -385,8 +423,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 +455,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 +483,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 +491,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 +570,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 +579,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()
         }
@@ -569,6 +605,16 @@
         override fun onSynchronousComplicationRequest(
             complicationInstanceId: Int,
             type: Int
+        ) = onSynchronousComplicationRequest2(
+            complicationInstanceId,
+            isForSafeWatchFace = false,
+            type
+        )
+
+        override fun onSynchronousComplicationRequest2(
+            complicationInstanceId: Int,
+            isForSafeWatchFace: Boolean,
+            type: Int
         ): android.support.wearable.complications.ComplicationData? {
             val expectedDataType = fromWireType(type)
             val complicationType = fromWireType(type)
@@ -577,10 +623,12 @@
                 null
             mainThreadHandler.post {
                 this@ComplicationDataSourceService.onComplicationRequest(
+                    @Suppress("NewApi")
                     ComplicationRequest(
                         complicationInstanceId,
                         complicationType,
-                        immediateResponseRequired = true
+                        immediateResponseRequired = true,
+                        isForSafeWatchFace = isForSafeWatchFace
                     ),
                     object : ComplicationRequestListener {
                         override fun onComplicationData(complicationData: ComplicationData?) {
@@ -594,8 +642,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 +668,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 +707,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 +767,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 +778,14 @@
          *
          * 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.
+         *
+         * From Android T, if this provider has the privileged permission
+         * com.google.wear.permission.GET_IS_FOR_SAFE_WATCH_FACEl, then
+         * [ComplicationRequest.isForSafeWatchFace] will be true if the request is on behalf of a
+         * watch face in this list.
          */
         // TODO(b/192233205): Migrate value to androidx.
         public const val METADATA_KEY_SAFE_WATCH_FACES: String =
@@ -743,9 +793,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 +834,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 7f4d0da..0000000
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.java
+++ /dev/null
@@ -1,416 +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.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.robolectric.shadows.ShadowLooper.runUiThreadTasks;
-
-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.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.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 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 org.robolectric.shadows.ShadowLooper;
-
-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(Resources.getSystem(), 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);
-
-        runUiThreadTasksWhileAwaitingDataLatch(1000);
-        verify(mRemoteManager).updateComplicationData(
-                eq(123),
-                argThat(data ->
-                        data.getLongText().getTextAt(Resources.getSystem(), 0)
-                                .equals("hello world")));
-    }
-
-    @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(Resources.getSystem(), 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(Resources.getSystem(), 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(Resources.getSystem(),
-                0)).isEqualTo(
-                "A"
-        );
-
-        assertThat(timeLineEntries.get(1).getTimelineStartEpochSecond()).isEqualTo(6000);
-        assertThat(timeLineEntries.get(1).getTimelineEndEpochSecond()).isEqualTo(8000);
-        assertThat(timeLineEntries.get(1).getLongText().getTextAt(Resources.getSystem(),
-                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(Resources.getSystem(), 0)).isEqualTo(
-                    "hello");
-        } finally {
-            thread.quitSafely();
-        }
-    }
-
-    private void runUiThreadTasksWhileAwaitingDataLatch(long timeout) throws InterruptedException {
-        // Allowing UI thread to execute while we wait for the data latch.
-        long attempts = 0;
-        while (!mUpdateComplicationDataLatch.await(1, TimeUnit.MILLISECONDS)) {
-            runUiThreadTasks();
-            assertThat(attempts++).isLessThan(timeout); // In total waiting ~timeout.
-        }
-    }
-}
-
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..901fd9d
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.kt
@@ -0,0 +1,526 @@
+/*
+ * 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.support.wearable.complications.ComplicationData as WireComplicationData
+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.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
+    fun testOnComplicationRequest_isForSafeWatchFace() {
+        mService.responseData = LongTextComplicationData.Builder(
+            PlainComplicationText.Builder("hello").build(),
+            ComplicationText.EMPTY
+        ).build()
+        val id = 123
+
+        @Suppress("NewApi") // onUpdate2
+        mProvider.onUpdate2(
+            id, ComplicationType.LONG_TEXT.toWireComplicationType(),
+            /* isForSafeWatchFace= */ true, mLocalManager
+        )
+
+        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        @Suppress("NewApi") // isForSafeWatchFace
+        assertThat(mService.lastRequest!!.isForSafeWatchFace).isTrue()
+    }
+
+    @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()
+        }
+    }
+
+    @Test
+    @Suppress("NewApi") // onSynchronousComplicationRequest2
+    fun testImmediateRequest_isForSafeWatchFace() {
+        val id = 123
+        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<android.support.wearable.complications.ComplicationData>()
+            val doneLatch = CountDownLatch(1)
+            threadHandler.post {
+                try {
+                    @Suppress("NewApi") // onSynchronousComplicationRequest2
+                    response.set(
+                        mProvider.onSynchronousComplicationRequest2(
+                            id,
+                            /* isForSafeWatchFace= */ true,
+                            ComplicationType.LONG_TEXT.toWireComplicationType()
+                        )
+                    )
+                    doneLatch.countDown()
+                } catch (e: RemoteException) {
+                    // Should not happen
+                }
+            }
+
+            assertThat(doneLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+            @Suppress("NewApi") // isForSafeWatchFace
+            assertThat(mService.lastRequest!!.isForSafeWatchFace).isTrue()
+        } 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 d3d5f95..4a04d64 100644
--- a/wear/watchface/watchface-complications-data/api/current.txt
+++ b/wear/watchface/watchface-complications-data/api/current.txt
@@ -83,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;
@@ -127,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();
@@ -372,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);
@@ -444,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();
@@ -497,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 0ffb4b9..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
@@ -86,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;
@@ -130,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();
@@ -375,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);
@@ -447,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();
@@ -500,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 1b752c6..dccc614 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.txt
@@ -83,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;
@@ -127,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();
@@ -373,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);
@@ -447,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();
@@ -500,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 fedd5c8..f4d254b 100644
--- a/wear/watchface/watchface-complications-data/build.gradle
+++ b/wear/watchface/watchface-complications-data/build.gradle
@@ -44,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/aidl/android/support/wearable/complications/IComplicationProvider.aidl b/wear/watchface/watchface-complications-data/src/main/aidl/android/support/wearable/complications/IComplicationProvider.aidl
index e496132..d5e8eba 100644
--- a/wear/watchface/watchface-complications-data/src/main/aidl/android/support/wearable/complications/IComplicationProvider.aidl
+++ b/wear/watchface/watchface-complications-data/src/main/aidl/android/support/wearable/complications/IComplicationProvider.aidl
@@ -15,7 +15,7 @@
     /**
      * API version number. This should be incremented every time a new method is added.
      */
-    const int API_VERSION = 2;
+    const int API_VERSION = 3;
 
     /**
      * Called when a complication data update is requested for the given complication id.
@@ -132,4 +132,30 @@
      * @since API version 2.
      */
     ComplicationData onSynchronousComplicationRequest(int complicationInstanceId, int type) = 7;
+
+    /**
+     * Same as {@link #onUpdate}, but specifies isForSafeWatchFace.
+     *
+     * @param complicationInstanceId The system's id for the updated complication which is a unique
+     * value for the tuple [Watch face ComponentName, complication slot ID].
+     * @param type The type of complication requested
+     * @param manager The binder for IComplicationManager
+     * @param isForSafeWatchFace Whether this request is on behalf of a safe watchface as defined by
+     * the data source.
+     * @since API version 3.
+     */
+    void onUpdate2(int complicationInstanceId, int type, boolean isForSafeWatchFace,
+        IBinder manager) = 8;
+
+    /**
+     * Same as {@link #onSynchronousComplicationRequest2}, but specifies isForSafeWatchFace.
+     *
+     * @param complicationInstanceId The system's id for the requested complication which is a
+     * @param type The type of complication requested
+     * unique value for the tuple [Watch face ComponentName, complication slot ID].
+     * @return The updated ComplicationData or null if no update is necessary
+     * @since API version 3.
+     */
+    ComplicationData onSynchronousComplicationRequest2(int complicationInstanceId,
+        boolean isForSafeWatchFace, int type) = 9;
 }
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 01aae9d..a58485a 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,17 +16,18 @@
 
 package androidx.wear.watchface.complications.data
 
+import android.icu.util.ULocale
 import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.support.wearable.complications.ComplicationText as WireComplicationText
-import android.icu.util.ULocale
 import androidx.annotation.RestrictTo
+import androidx.core.util.Consumer
 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
@@ -49,18 +50,25 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 class ComplicationDataExpressionEvaluator(
     val unevaluatedData: WireComplicationData,
+    private val stateStore: ObservableStateStore = ObservableStateStore(emptyMap()),
+    private val sensorGateway: SensorGateway? = null,
 ) : AutoCloseable {
     /**
      * Java compatibility class for [ComplicationDataExpressionEvaluator].
      *
      * Unlike [data], [listener] is not invoked until there is a value (until [data] is non-null).
      */
-    class Compat(
+    class Compat
+    @JvmOverloads
+    constructor(
         val unevaluatedData: WireComplicationData,
         private val executor: Executor,
         private val listener: Consumer<WireComplicationData>,
+        stateStore: ObservableStateStore = ObservableStateStore(emptyMap()),
+        sensorGateway: SensorGateway? = null,
     ) : AutoCloseable {
-        private val evaluator = ComplicationDataExpressionEvaluator(unevaluatedData)
+        private val evaluator =
+            ComplicationDataExpressionEvaluator(unevaluatedData, stateStore, sensorGateway)
 
         /** @see ComplicationDataExpressionEvaluator.init */
         fun init() {
@@ -117,7 +125,8 @@
         val receivers = mutableSetOf<ComplicationEvaluationResultReceiver<out Any>>()
 
         if (unevaluatedData.hasRangedValueExpression()) {
-            unevaluatedData.rangedValueExpression?.buildReceiver { setRangedValue(it) }
+            unevaluatedData.rangedValueExpression
+                ?.buildReceiver { setRangedValue(it) }
                 ?.let { receivers += it }
         }
         if (unevaluatedData.hasLongText()) {
@@ -133,7 +142,8 @@
             unevaluatedData.shortTitle?.buildReceiver { setShortTitle(it) }?.let { receivers += it }
         }
         if (unevaluatedData.hasContentDescription()) {
-            unevaluatedData.contentDescription?.buildReceiver { setContentDescription(it) }
+            unevaluatedData.contentDescription
+                ?.buildReceiver { setContentDescription(it) }
                 ?.let { receivers += it }
         }
 
@@ -142,40 +152,45 @@
 
     private fun DynamicFloat.buildReceiver(
         setter: WireComplicationData.Builder.(Float) -> WireComplicationData.Builder
-    ) = ComplicationEvaluationResultReceiver(
-        setter,
-        binder = { receiver -> evaluator.bind(this@buildReceiver, receiver) },
-    )
+    ) =
+        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)
-            },
-        )
-    }
+    ) =
+        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 = */ null,
-            ObservableStateStore(emptyMap()),
-        )
+        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))
+        state
+            .onEach {
+                if (it.invalid.isNotEmpty()) _data.value = INVALID_DATA
+                else if (it.pending.isEmpty()) _data.value = it.data
+            }
+            .launchIn(CoroutineScope(Dispatchers.Main))
     }
 
     /**
@@ -219,7 +234,8 @@
         override fun onData(newData: T) {
             state.update {
                 it.withComplete(
-                    setter(WireComplicationData.Builder(it.data), newData).build(), this
+                    setter(WireComplicationData.Builder(it.data), newData).build(),
+                    this
                 )
             }
         }
@@ -231,5 +247,15 @@
 
     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)
+            }
     }
 }
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 72da694..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
@@ -42,8 +42,8 @@
  * 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 {
@@ -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,13 +339,13 @@
         /**
          * 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
-         * watch face is allowed to treat [ForegroundColorSpan] as a hint that it should render the
+         * 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],
@@ -366,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()
+            )
     }
 }
 
@@ -415,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) =
@@ -463,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
@@ -482,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 `^^`.
          *
@@ -501,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())
 
@@ -525,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)
         }
@@ -539,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
@@ -572,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())
 
@@ -631,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) =
@@ -680,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/main/res/values-ca/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
index 28b4d7e..0131185 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
@@ -2,34 +2,34 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
     </plurals>
     <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dies</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dies</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dia</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hores</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hores</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
     </plurals>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
index 6a7b049..fc52b84 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
@@ -2,34 +2,34 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
     </plurals>
     <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
     </plurals>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
index 78df7ea..d33c38f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
@@ -19,17 +19,17 @@
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> minuto</item>
     </plurals>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
index b7f280d9..e9bab9f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
@@ -2,34 +2,34 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> g</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> g</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> g</item>
     </plurals>
     <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> giorni</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> giorni</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> giorno</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ore</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ore</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ora</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
     </plurals>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
index 02899c2..bd29110 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
@@ -13,24 +13,24 @@
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dia</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hora</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuto</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
     </plurals>
     <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
index 43be2b3..e342d0c 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
@@ -2,34 +2,34 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
     </plurals>
     <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dia</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
     </plurals>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
index 02899c2..bd29110 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
@@ -13,24 +13,24 @@
     </plurals>
     <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
     </plurals>
     <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
     <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
     <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
       <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dia</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
     </plurals>
     <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
       <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hora</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
       <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuto</item>
-      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+      <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
     </plurals>
     <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
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 69481cd..7aeaf57 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
@@ -20,28 +20,36 @@
 import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.util.Log
 import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
 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.function.Consumer
+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)
 class ComplicationDataExpressionEvaluatorTest {
-    @get:Rule
-    val expect = Expect.create()
+    @get:Rule val expect = Expect.create()
 
     private val listener = mock<Consumer<WireComplicationData>>()
 
@@ -68,104 +76,289 @@
     }
 
     /**
-     * Scenarios for testing per-field static expressions.
+     * Scenarios for testing expressions.
      *
-     * Each scenario describes how to set the expression in the [WireComplicationData] and how to
-     * set the evaluated value.
-     *
-     * Note that evaluated data retains the expression.
+     * Each scenario describes the expressed data, the flow of states, and the flow of the evaluated
+     * data output.
      */
-    enum class StaticExpressionScenario(
-        val expressed: WireComplicationData.Builder.() -> WireComplicationData.Builder,
-        val evaluated: WireComplicationData.Builder.() -> WireComplicationData.Builder,
+    enum class DataExpressionScenario(
+        val expressed: WireComplicationData,
+        val states: List<Map<String, StateEntryValue>>,
+        val evaluated: List<WireComplicationData>,
     ) {
-        RANGED_VALUE(
-            expressed = { setRangedValueExpression(DynamicFloat.constant(10f)) },
-            evaluated = {
-                setRangedValue(10f).setRangedValueExpression(DynamicFloat.constant(10f))
-            },
+        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()
+                ),
         ),
-        LONG_TEXT(
-            expressed = { setLongText(WireComplicationText(DynamicString.constant("hello"))) },
-            evaluated = {
-                setLongText(WireComplicationText("hello", DynamicString.constant("hello")))
-            },
+        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()
+                ),
         ),
-        LONG_TITLE(
-            expressed = { setLongTitle(WireComplicationText(DynamicString.constant("hello"))) },
-            evaluated = {
-                setLongTitle(WireComplicationText("hello", DynamicString.constant("hello")))
-            },
+        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(),
+                ),
         ),
-        SHORT_TEXT(
-            expressed = { setShortText(WireComplicationText(DynamicString.constant("hello"))) },
-            evaluated = {
-                setShortText(WireComplicationText("hello", DynamicString.constant("hello")))
-            },
+        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.
+                ),
         ),
-        SHORT_TITLE(
-            expressed = { setShortTitle(WireComplicationText(DynamicString.constant("hello"))) },
-            evaluated = {
-                setShortTitle(WireComplicationText("hello", DynamicString.constant("hello")))
-            },
-        ),
-        CONTENT_DESCRIPTION(
-            expressed = {
-                setContentDescription(WireComplicationText(DynamicString.constant("hello")))
-            },
-            evaluated = {
-                setContentDescription(
-                    WireComplicationText("hello", DynamicString.constant("hello"))
-                )
-            },
+        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 data_staticExpression_setToEvaluated() {
-        for (scenario in StaticExpressionScenario.values()) {
-            val base = WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA).build()
-            val expressed = scenario.expressed(WireComplicationData.Builder(base)).build()
-            val evaluated =
-                scenario.evaluated(WireComplicationData.Builder(base)).build()
-
-            ComplicationDataExpressionEvaluator(expressed).use { evaluator ->
+    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).use { evaluator ->
+                val allEvaluations =
+                    evaluator.data
+                        .filterNotNull()
+                        .shareIn(
+                            CoroutineScope(Dispatchers.Main),
+                            SharingStarted.Eagerly,
+                            replay = 10,
+                        )
                 evaluator.init()
-                runUiThreadTasks()
+                runUiThreadTasks() // Ensures data sharing started.
+
+                for (state in scenario.states) {
+                    stateStore.setStateEntryValues(state)
+                    runUiThreadTasks() // Ensures data sharing ended.
+                }
 
                 expect
                     .withMessage(scenario.name)
-                    .that(evaluator.data.value)
-                    .isEqualTo(evaluated)
+                    .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 hasExpression_dataWithExpression_returnsTrue() {
+        for (scenario in HasExpressionDataWithExpressionScenario.values()) {
+            expect.withMessage(scenario.name).that(hasExpression(scenario.data)).isTrue()
+        }
+    }
+
+    @Test
+    fun hasExpression_dataWithoutExpression_returnsFalse() {
+        assertThat(hasExpression(DATA_WITH_NO_EXPRESSION)).isFalse()
+    }
+
     @Test
     fun compat_notInitialized_listenerNotInvoked() {
         ComplicationDataExpressionEvaluator.Compat(
-            DATA_WITH_NO_EXPRESSION,
-            ContextCompat.getMainExecutor(getApplicationContext()),
-            listener,
-        ).use {
-            runUiThreadTasks()
+                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()
+                DATA_WITH_NO_EXPRESSION,
+                ContextCompat.getMainExecutor(getApplicationContext()),
+                listener,
+            )
+            .use { evaluator ->
+                evaluator.init()
+                runUiThreadTasks()
 
-            verify(listener, times(1)).accept(DATA_WITH_NO_EXPRESSION)
-        }
+                verify(listener, times(1)).accept(DATA_WITH_NO_EXPRESSION)
+            }
     }
 
     private companion object {
@@ -173,5 +366,9 @@
             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) }
     }
 }
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
index dacb1c0..4697b4f 100644
--- 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
@@ -21,16 +21,14 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for {@link
- * androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption2}.
+ * Wire format for {@link androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption2}.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class CustomValueOption2WireFormat extends OptionWireFormat {
-    CustomValueOption2WireFormat() {
-    }
+    CustomValueOption2WireFormat() {}
 
     // 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/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
index acc3593..119c11b 100644
--- 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
@@ -35,10 +35,11 @@
 @VersionedParcelize
 public class CustomValueUserStyleSetting2WireFormat extends UserStyleSettingWireFormat {
 
-    CustomValueUserStyleSetting2WireFormat() {
-    }
+    CustomValueUserStyleSetting2WireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public CustomValueUserStyleSetting2WireFormat(
             @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/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 5264a84..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
@@ -52,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
@@ -67,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(
@@ -107,7 +106,6 @@
                 }
                 booleanStyle.visibility = View.VISIBLE
             }
-
             is ListUserStyleSetting -> {
                 styleOptionsList.adapter =
                     ListStyleSettingViewAdapter(
@@ -120,7 +118,6 @@
                 styleOptionsList.layoutManager = WearableLinearLayoutManager(context)
                 styleOptionsList.visibility = View.VISIBLE
             }
-
             is ComplicationSlotsUserStyleSetting -> {
                 styleOptionsList.adapter =
                     ComplicationsStyleSettingViewAdapter(
@@ -132,21 +129,16 @@
                 styleOptionsList.layoutManager = WearableLinearLayoutManager(context)
                 styleOptionsList.visibility = View.VISIBLE
             }
-
             is CustomValueUserStyleSetting -> {
                 // 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()
@@ -154,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
     }
@@ -178,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) {}
 
@@ -197,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)]!!
     }
@@ -218,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) {
@@ -282,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]
@@ -320,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 5cecba6..53940f3 100644
--- a/wear/watchface/watchface-style/api/current.txt
+++ b/wear/watchface/watchface-style/api/current.txt
@@ -296,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 5cecba6..53940f3 100644
--- a/wear/watchface/watchface-style/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-style/api/public_plus_experimental_current.txt
@@ -296,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 5cecba6..53940f3 100644
--- a/wear/watchface/watchface-style/api/restricted_current.txt
+++ b/wear/watchface/watchface-style/api/restricted_current.txt
@@ -296,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 0fb4ec9..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) {
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 697d684..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,13 +531,10 @@
             when (setting) {
                 is UserStyleSetting.ComplicationSlotsUserStyleSetting ->
                     complicationSlotsUserStyleSettingCount++
-
                 is UserStyleSetting.CustomValueUserStyleSetting ->
                     customValueUserStyleSettingCount++
-
                 is UserStyleSetting.CustomValueUserStyleSetting2 ->
                     customValueUserStyleSettingCount++
-
                 else -> {
                     // Nothing
                 }
@@ -567,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"
             }
         }
 
@@ -622,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)
                 }
@@ -638,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() + "]"
@@ -709,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
@@ -726,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].
@@ -740,6 +724,7 @@
 
     /**
      * The UserStyle options must be from the supplied [UserStyleSchema].
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -759,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 0b0683b..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,10 +49,10 @@
 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.CustomValueOptionWireFormat
 import androidx.wear.watchface.style.data.CustomValueOption2WireFormat
-import androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat
+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
 import androidx.wear.watchface.style.data.ListOptionWireFormat
@@ -131,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,
@@ -193,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)
@@ -214,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)
             }
         }
@@ -241,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)
@@ -253,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
             ) {
@@ -268,11 +269,12 @@
             }
         }
         for (option in options) {
-            sizeEstimate += option.estimateWireSizeInBytesAndValidateIconDimensions(
-                context,
-                maxWidth,
-                maxHeight
-            )
+            sizeEstimate +=
+                option.estimateWireSizeInBytesAndValidateIconDimensions(
+                    context,
+                    maxWidth,
+                    maxHeight
+                )
         }
         return sizeEstimate
     }
@@ -314,40 +316,35 @@
         @Suppress("NewApi") // CustomValueUserStyleSetting2
         internal fun createFromWireFormat(
             wireFormat: UserStyleSettingWireFormat
-        ): 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
-            )
-        }
-
-        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,
@@ -365,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)
@@ -383,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,
@@ -423,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(
@@ -469,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)
                     }
@@ -501,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),
@@ -556,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>
     ) {
@@ -633,9 +621,9 @@
                 /**
                  * 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.
+                 * 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.
@@ -666,35 +654,26 @@
             /** @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
+                        )
                 }
         }
 
@@ -734,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]
@@ -749,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,
@@ -791,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(
@@ -829,7 +808,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -875,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,
@@ -904,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
@@ -928,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 {
@@ -940,9 +908,7 @@
                 }
 
                 @JvmStatic
-                internal fun fromWireFormat(
-                    wireFormat: BooleanOptionWireFormat
-                ): BooleanOption {
+                internal fun fromWireFormat(wireFormat: BooleanOptionWireFormat): BooleanOption {
                     return from(wireFormat.mId[0] == 1.toByte())
                 }
             }
@@ -958,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.
@@ -997,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")
@@ -1039,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,
@@ -1073,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
@@ -1087,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
                 }
 
@@ -1124,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(
@@ -1151,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,
@@ -1236,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
                         }
@@ -1264,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,
@@ -1306,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,
@@ -1350,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,
@@ -1389,7 +1334,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -1416,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 ->
@@ -1456,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 {
@@ -1478,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,
@@ -1543,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
@@ -1555,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)
@@ -1580,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
             }
@@ -1593,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
@@ -1631,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(
@@ -1691,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()
                         )
                     }
@@ -1713,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
@@ -1737,8 +1680,7 @@
 
             /** @hide */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-            override fun toWireFormat():
-                ComplicationsOptionWireFormat =
+            override fun toWireFormat(): ComplicationsOptionWireFormat =
                 ComplicationsOptionWireFormat(
                     id.value,
                     displayName,
@@ -1746,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 },
@@ -1777,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 =
@@ -1816,7 +1757,6 @@
                                     throw IllegalNodeException(parser)
                                 }
                             }
-
                             else -> throw IllegalNodeException(parser)
                         }
                     }
@@ -1867,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,
@@ -1903,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,
@@ -1945,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,
@@ -1994,7 +1942,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2033,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]. */
@@ -2046,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()
             ) {
@@ -2089,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 {
@@ -2115,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
@@ -2156,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,
@@ -2193,7 +2142,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2218,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 ->
@@ -2256,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 ->
@@ -2275,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,
@@ -2322,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?
@@ -2332,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
@@ -2343,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)
@@ -2367,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
             }
@@ -2377,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")
@@ -2410,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(
@@ -2443,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(
@@ -2513,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
@@ -2535,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)
@@ -2558,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>()
@@ -2582,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 " +
@@ -2592,7 +2529,6 @@
                                 }
                                 childSettings.add(setting)
                             }
-
                             "OnWatchEditorData" -> {
                                 if (watchFaceEditorData == null) {
                                     watchFaceEditorData =
@@ -2601,7 +2537,6 @@
                                     throw IllegalNodeException(parser)
                                 }
                             }
-
                             else -> throw IllegalNodeException(parser)
                         }
                     }
@@ -2642,10 +2577,7 @@
                         LongRangeOption(maximumValue)
                     )
                 } else {
-                    listOf(
-                        LongRangeOption(minimumValue),
-                        LongRangeOption(maximumValue)
-                    )
+                    listOf(LongRangeOption(minimumValue), LongRangeOption(maximumValue))
                 }
             }
 
@@ -2655,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,
@@ -2691,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,
@@ -2738,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,
@@ -2781,7 +2722,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2820,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
@@ -2835,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()
             ) {
@@ -2876,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 {
@@ -2916,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(
@@ -2946,7 +2884,7 @@
                 getWireFormatOptionsList(),
                 affectedWatchFaceLayers.map { it.ordinal },
                 watchFaceEditorData?.toWireFormat(),
-                /* optionsOnWatchFaceEditorIcons = */null
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
 
         /**
@@ -2964,8 +2902,8 @@
             /**
              * Constructs a CustomValueOption.
              *
-             * @param customValue The [ByteArray] [id] and value of this CustomValueOption. This
-             * may not exceed [Option.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())
 
@@ -2987,15 +2925,14 @@
         }
 
         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
+     * [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].
      *
@@ -3011,10 +2948,10 @@
          * Constructs a CustomValueUserStyleSetting2.
          *
          * @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(
@@ -3041,7 +2978,7 @@
                 getWireFormatOptionsList(),
                 affectedWatchFaceLayers.map { it.ordinal },
                 watchFaceEditorData?.toWireFormat(),
-                /* optionsOnWatchFaceEditorIcons = */null
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
 
         /**
@@ -3059,8 +2996,8 @@
             /**
              * Constructs a CustomValueOption.
              *
-             * @param customValue The [ByteArray] [id] and value of this CustomValueOption. This
-             * may not exceed [Option.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())
 
@@ -3082,7 +3019,7 @@
 
             public companion object {
                 /**
-                 * The maximum size of [customValue] in bytes.  This is based on the following
+                 * 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).
                  */
@@ -3093,9 +3030,8 @@
         }
 
         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)
     }
 }
 
@@ -3105,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 {
@@ -3129,7 +3059,6 @@
                         context.resources
                     )
                 }
-
                 Icon.TYPE_URI -> {
                     if (icon.uri.scheme == ContentResolver.SCHEME_CONTENT) {
                         context.contentResolver.openInputStream(icon.uri)?.let {
@@ -3137,7 +3066,6 @@
                         }
                     }
                 }
-
                 Icon.TYPE_URI_ADAPTIVE_BITMAP -> {
                     if (icon.uri.scheme == ContentResolver.SCHEME_CONTENT) {
                         context.contentResolver.openInputStream(icon.uri)?.let {
@@ -3156,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())
             }
 
@@ -3197,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()
@@ -3211,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,
@@ -3224,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) {
@@ -3248,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) {
@@ -3271,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 e54c657..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
@@ -23,7 +23,6 @@
 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
@@ -32,8 +31,8 @@
 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
@@ -59,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)
@@ -161,52 +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 = CustomValueUserStyleSetting2(
-            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()
@@ -218,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)
@@ -242,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)
@@ -264,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 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()
     }
@@ -282,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 =
@@ -380,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()
@@ -415,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)
@@ -457,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)
     }
 
@@ -561,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)
@@ -653,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)
@@ -690,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)
@@ -704,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
@@ -752,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 0c2bf31..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
@@ -30,11 +30,11 @@
 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 {
@@ -66,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
@@ -114,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
@@ -215,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)
@@ -263,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())
@@ -398,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(
@@ -452,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(
@@ -466,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/build.gradle b/webkit/integration-tests/testapp/build.gradle
index c7f39ec..2d2e298 100644
--- a/webkit/integration-tests/testapp/build.gradle
+++ b/webkit/integration-tests/testapp/build.gradle
@@ -31,7 +31,6 @@
     implementation(libs.espressoIdlingNet)
     implementation(libs.espressoIdlingResource)
 
-    androidTestImplementation(libs.espressoRemote)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
diff --git a/webkit/integration-tests/testapp/src/androidTest/AndroidManifest.xml b/webkit/integration-tests/testapp/src/androidTest/AndroidManifest.xml
index 5ec74fb..99cbcac 100644
--- a/webkit/integration-tests/testapp/src/androidTest/AndroidManifest.xml
+++ b/webkit/integration-tests/testapp/src/androidTest/AndroidManifest.xml
@@ -15,13 +15,4 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.example.androidx.webkit"
-        android:targetProcesses="*">
-        <!-- This enables Multiprocess Espresso. -->
-        <meta-data
-            android:name="remoteMethod"
-            android:value="androidx.test.espresso.remote.EspressoRemote#remoteInit" />
-    </instrumentation>
 </manifest>
\ No newline at end of file
diff --git a/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProcessGlobalConfigActivityTestAppTest.java b/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProcessGlobalConfigActivityTestAppTest.java
index 43e3a0d..8babd32 100644
--- a/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProcessGlobalConfigActivityTestAppTest.java
+++ b/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProcessGlobalConfigActivityTestAppTest.java
@@ -16,11 +16,6 @@
 
 package com.example.androidx.webkit;
 
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-
 import static org.junit.Assert.assertTrue;
 
 import androidx.core.content.ContextCompat;
@@ -44,8 +39,8 @@
 @LargeTest
 public class ProcessGlobalConfigActivityTestAppTest {
     @Rule
-    public ActivityScenarioRule<MainActivity> mRule =
-            new ActivityScenarioRule<>(MainActivity.class);
+    public ActivityScenarioRule<ProcessGlobalConfigActivity> mRule =
+            new ActivityScenarioRule<>(ProcessGlobalConfigActivity.class);
 
     @Before
     public void setUp() {
@@ -70,8 +65,9 @@
                     + "delete it");
         }
         WebkitTestHelpers.clickMenuListItemWithString(
-                R.string.process_global_config_activity_title);
-        onView(withId(R.id.process_global_textview)).check(matches(withText("WebView Loaded!")));
+                R.string.data_directory_suffix_activity_title);
+        // We need to wait for the WebView to finish loading on a different process.
+        Thread.sleep(5000);
 
         assertTrue(file.exists());
     }
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 18a126c..45deec8 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,7 +22,6 @@
 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;
@@ -42,7 +41,6 @@
         WebkitTestHelpers.assumeFeature(WebViewFeature.PROXY_OVERRIDE);
     }
 
-    @Ignore // b/267381688
     @Test
     public void testProxyOverride() {
         WebkitTestHelpers.clickMenuListItemWithString(R.string.proxy_override_activity_title);
@@ -58,7 +56,6 @@
                                 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/integration-tests/testapp/src/main/AndroidManifest.xml b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
index 0428b05..fd36cc4 100644
--- a/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -125,7 +125,10 @@
             android:exported="true" />
         <activity
             android:name=".ProcessGlobalConfigActivity"
-            android:process=":processGlobalConfigTest"
+            android:exported="true" />
+        <activity
+            android:name=".DataDirectorySuffixActivity"
+            android:process=":dataDirectorySuffixActivity"
             android:exported="true" />
         <activity
             android:name=".RequestedWithHeaderActivity"
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/DataDirectorySuffixActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/DataDirectorySuffixActivity.java
new file mode 100644
index 0000000..1c92b41
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/DataDirectorySuffixActivity.java
@@ -0,0 +1,59 @@
+/*
+ * 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 com.example.androidx.webkit;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.webkit.ProcessGlobalConfig;
+import androidx.webkit.WebViewFeature;
+
+
+/**
+ * An {@link Activity} which makes use of
+ * {@link androidx.webkit.ProcessGlobalConfig#setDataDirectorySuffix(Context, String)}.
+ */
+public class DataDirectorySuffixActivity extends AppCompatActivity {
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTitle(R.string.data_directory_suffix_activity_title);
+        WebkitHelpers.appendWebViewVersionToTitle(this);
+
+        if (!WebViewFeature.isStartupFeatureSupported(this,
+                WebViewFeature.STARTUP_FEATURE_SET_DATA_DIRECTORY_SUFFIX)) {
+            WebkitHelpers.showMessageInActivity(this, R.string.webkit_api_not_available);
+            return;
+        }
+        ProcessGlobalConfig config = new ProcessGlobalConfig();
+        config.setDataDirectorySuffix(this,
+                "per_process_webview_data_test");
+        ProcessGlobalConfig.apply(config);
+        setContentView(R.layout.activity_data_directory_config);
+        WebView wv = findViewById(R.id.data_directory_config_webview);
+        wv.getSettings().setJavaScriptEnabled(true);
+        wv.setWebViewClient(new WebViewClient());
+        wv.loadUrl("www.google.com");
+        TextView tv = findViewById(R.id.data_directory_config_textview);
+        tv.setText("WebView Loaded!");
+    }
+}
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java
index b6fb511..0bd1d67 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/ProcessGlobalConfigActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 The Android Open Source Project
+ * 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.
@@ -17,43 +17,33 @@
 package com.example.androidx.webkit;
 
 import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.TextView;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.webkit.ProcessGlobalConfig;
-import androidx.webkit.WebViewFeature;
-
 
 /**
- * An {@link Activity} which makes use of {@link androidx.webkit.ProcessGlobalConfig} to set up
- * process global configuration prior to loading WebView.
+ * An {@link Activity} which lists features that make use of
+ * {@link androidx.webkit.ProcessGlobalConfig} to set up process global configuration prior to
+ * loading WebView.
  */
 public class ProcessGlobalConfigActivity extends AppCompatActivity {
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
         setTitle(R.string.process_global_config_activity_title);
         WebkitHelpers.appendWebViewVersionToTitle(this);
-
-        if (!WebViewFeature.isStartupFeatureSupported(this,
-                WebViewFeature.STARTUP_FEATURE_SET_DATA_DIRECTORY_SUFFIX)) {
-            WebkitHelpers.showMessageInActivity(this, R.string.webkit_api_not_available);
-            return;
-        }
-        ProcessGlobalConfig config = new ProcessGlobalConfig();
-        config.setDataDirectorySuffix(this,
-                "per_process_webview_data_test");
-        ProcessGlobalConfig.apply(config);
-        setContentView(R.layout.activity_process_global_config);
-        WebView wv = findViewById(R.id.process_global_config_webview);
-        wv.getSettings().setJavaScriptEnabled(true);
-        wv.setWebViewClient(new WebViewClient());
-        wv.loadUrl("www.google.com");
-        TextView tv = findViewById(R.id.process_global_textview);
-        tv.setText("WebView Loaded!");
+        final Context activityContext = this;
+        MenuListView listView = findViewById(R.id.top_level_list);
+        MenuListView.MenuItem[] menuItems = new MenuListView.MenuItem[] {
+                new MenuListView.MenuItem(
+                        getResources().getString(R.string.data_directory_suffix_activity_title),
+                        new Intent(activityContext, DataDirectorySuffixActivity.class)),
+        };
+        listView.setItems(menuItems);
     }
 }
diff --git a/webkit/integration-tests/testapp/src/main/res/layout/activity_data_directory_config.xml b/webkit/integration-tests/testapp/src/main/res/layout/activity_data_directory_config.xml
new file mode 100644
index 0000000..3e41dab
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/res/layout/activity_data_directory_config.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!--Orientation is decided at runtime-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/activity_medium_interstitial"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:ignore="Orientation">
+
+    <TextView
+        android:id="@+id/data_directory_config_textview"
+        android:layout_width="wrap_content"
+        android:layout_height="105dp"
+        android:text="TextView" />
+
+    <WebView
+        android:id="@+id/data_directory_config_webview"
+        android:layout_width="match_parent"
+        android:layout_height="604dp"></WebView>
+</LinearLayout>
+
+
diff --git a/webkit/integration-tests/testapp/src/main/res/layout/activity_process_global_config.xml b/webkit/integration-tests/testapp/src/main/res/layout/activity_process_global_config.xml
deleted file mode 100644
index e898b1d..0000000
--- a/webkit/integration-tests/testapp/src/main/res/layout/activity_process_global_config.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--Orientation is decided at runtime-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/activity_medium_interstitial"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    tools:ignore="Orientation">
-
-    <TextView
-        android:id="@+id/process_global_textview"
-        android:layout_width="wrap_content"
-        android:layout_height="105dp"
-        android:text="TextView" />
-
-    <WebView
-        android:id="@+id/process_global_config_webview"
-        android:layout_width="match_parent"
-        android:layout_height="604dp"></WebView>
-</LinearLayout>
-
-
diff --git a/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml b/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
index fd3734d..7108765 100644
--- a/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
+++ b/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
@@ -100,6 +100,7 @@
 
     <!-- Process Global Config -->
     <string name="process_global_config_activity_title">Process Global Config</string>
+    <string name="data_directory_suffix_activity_title">Data Directory Suffix</string>
 
     <!-- Requested With Header -->
     <string name="requested_with_activity_title">X-Requested-With header allow-list</string>
diff --git a/window/extensions/extensions/api/current.txt b/window/extensions/extensions/api/current.txt
index b27ec92..6988f4b 100644
--- a/window/extensions/extensions/api/current.txt
+++ b/window/extensions/extensions/api/current.txt
@@ -4,6 +4,7 @@
   public interface WindowExtensions {
     method public default androidx.window.extensions.embedding.ActivityEmbeddingComponent? getActivityEmbeddingComponent();
     method public default int getVendorApiLevel();
+    method public default androidx.window.extensions.area.WindowAreaComponent? getWindowAreaComponent();
     method public androidx.window.extensions.layout.WindowLayoutComponent? getWindowLayoutComponent();
   }
 
@@ -13,13 +14,32 @@
 
 }
 
+package androidx.window.extensions.area {
+
+  public interface WindowAreaComponent {
+    method public void addRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void endRearDisplaySession();
+    method public void removeRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void startRearDisplaySession(android.app.Activity, androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    field public static final int SESSION_STATE_ACTIVE = 1; // 0x1
+    field public static final int SESSION_STATE_INACTIVE = 0; // 0x0
+    field public static final int STATUS_AVAILABLE = 2; // 0x2
+    field public static final int STATUS_UNAVAILABLE = 1; // 0x1
+    field public static final int STATUS_UNSUPPORTED = 0; // 0x0
+  }
+
+}
+
 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,9 +49,11 @@
   }
 
   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 {
@@ -40,12 +62,64 @@
   }
 
   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();
+    field @ColorInt public static final int DEFAULT_ANIMATION_BACKGROUND_COLOR = 0; // 0x0
+  }
+
+  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 {
     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 {
@@ -57,15 +131,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 {
@@ -78,19 +155,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
@@ -116,8 +197,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 b27ec92..6988f4b 100644
--- a/window/extensions/extensions/api/public_plus_experimental_current.txt
+++ b/window/extensions/extensions/api/public_plus_experimental_current.txt
@@ -4,6 +4,7 @@
   public interface WindowExtensions {
     method public default androidx.window.extensions.embedding.ActivityEmbeddingComponent? getActivityEmbeddingComponent();
     method public default int getVendorApiLevel();
+    method public default androidx.window.extensions.area.WindowAreaComponent? getWindowAreaComponent();
     method public androidx.window.extensions.layout.WindowLayoutComponent? getWindowLayoutComponent();
   }
 
@@ -13,13 +14,32 @@
 
 }
 
+package androidx.window.extensions.area {
+
+  public interface WindowAreaComponent {
+    method public void addRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void endRearDisplaySession();
+    method public void removeRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void startRearDisplaySession(android.app.Activity, androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    field public static final int SESSION_STATE_ACTIVE = 1; // 0x1
+    field public static final int SESSION_STATE_INACTIVE = 0; // 0x0
+    field public static final int STATUS_AVAILABLE = 2; // 0x2
+    field public static final int STATUS_UNAVAILABLE = 1; // 0x1
+    field public static final int STATUS_UNSUPPORTED = 0; // 0x0
+  }
+
+}
+
 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,9 +49,11 @@
   }
 
   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 {
@@ -40,12 +62,64 @@
   }
 
   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();
+    field @ColorInt public static final int DEFAULT_ANIMATION_BACKGROUND_COLOR = 0; // 0x0
+  }
+
+  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 {
     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 {
@@ -57,15 +131,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 {
@@ -78,19 +155,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
@@ -116,8 +197,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 b27ec92..6988f4b 100644
--- a/window/extensions/extensions/api/restricted_current.txt
+++ b/window/extensions/extensions/api/restricted_current.txt
@@ -4,6 +4,7 @@
   public interface WindowExtensions {
     method public default androidx.window.extensions.embedding.ActivityEmbeddingComponent? getActivityEmbeddingComponent();
     method public default int getVendorApiLevel();
+    method public default androidx.window.extensions.area.WindowAreaComponent? getWindowAreaComponent();
     method public androidx.window.extensions.layout.WindowLayoutComponent? getWindowLayoutComponent();
   }
 
@@ -13,13 +14,32 @@
 
 }
 
+package androidx.window.extensions.area {
+
+  public interface WindowAreaComponent {
+    method public void addRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void endRearDisplaySession();
+    method public void removeRearDisplayStatusListener(androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    method public void startRearDisplaySession(android.app.Activity, androidx.window.extensions.core.util.function.Consumer<java.lang.Integer!>);
+    field public static final int SESSION_STATE_ACTIVE = 1; // 0x1
+    field public static final int SESSION_STATE_INACTIVE = 0; // 0x0
+    field public static final int STATUS_AVAILABLE = 2; // 0x2
+    field public static final int STATUS_UNAVAILABLE = 1; // 0x1
+    field public static final int STATUS_UNSUPPORTED = 0; // 0x0
+  }
+
+}
+
 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,9 +49,11 @@
   }
 
   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 {
@@ -40,12 +62,64 @@
   }
 
   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();
+    field @ColorInt public static final int DEFAULT_ANIMATION_BACKGROUND_COLOR = 0; // 0x0
+  }
+
+  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 {
     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 {
@@ -57,15 +131,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 {
@@ -78,19 +155,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
@@ -116,8 +197,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/androidTest/java/androidx/window/extensions/embedding/SplitAttributesTest.java b/window/extensions/extensions/src/androidTest/java/androidx/window/extensions/embedding/SplitAttributesTest.java
new file mode 100644
index 0000000..0bd4c63
--- /dev/null
+++ b/window/extensions/extensions/src/androidTest/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(SplitAttributes.DEFAULT_ANIMATION_BACKGROUND_COLOR)
+                .build();
+        final SplitAttributes layout2 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.LOCALE)
+                .setAnimationBackgroundColor(SplitAttributes.DEFAULT_ANIMATION_BACKGROUND_COLOR)
+                .build();
+        final SplitAttributes layout3 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(SplitAttributes.DEFAULT_ANIMATION_BACKGROUND_COLOR)
+                .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/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
index c1a9bd8..240e2dc 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,11 @@
 
 package androidx.window.extensions;
 
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.window.extensions.area.WindowAreaComponent;
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
 import androidx.window.extensions.layout.WindowLayoutComponent;
 
@@ -29,6 +33,52 @@
  * {@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.
+     * The added APIs for Vendor API level 2 are:
+     * <ul>
+     *     <li>{@link androidx.window.extensions.embedding.SplitPlaceholderRule.Builder#setFinishPrimaryWithPlaceholder(int)}</li>
+     *     <li>{@link androidx.window.extensions.embedding.SplitAttributes}</li>
+     *     <li>{@link ActivityEmbeddingComponent#setSplitAttributesCalculator(
+     *      androidx.window.extensions.core.util.function.Function)}</li>
+     * </ul>
+     * @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.");
     }
 
     /**
@@ -61,4 +111,15 @@
     default ActivityEmbeddingComponent getActivityEmbeddingComponent() {
         return null;
     }
+
+    /**
+     * Returns the OEM implementation of {@link WindowAreaComponent} if it is supported on
+     * the device, {@code null} otherwise. The implementation must match the API level reported in
+     * {@link WindowExtensions}.
+     * @return the OEM implementation of {@link WindowAreaComponent}
+     */
+    @Nullable
+    default WindowAreaComponent getWindowAreaComponent() {
+        return null;
+    }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/area/WindowAreaComponent.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/area/WindowAreaComponent.java
new file mode 100644
index 0000000..422e972
--- /dev/null
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/area/WindowAreaComponent.java
@@ -0,0 +1,148 @@
+/*
+ * 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.extensions.area;
+
+import android.app.Activity;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Consumer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The interface definition that will be used by the WindowManager library to get custom
+ * OEM-provided behavior around moving windows between displays or display areas on a device.
+ *
+ * Currently the only behavior supported is RearDisplay Mode, where the window
+ * is moved to the display that faces the same direction as the rear camera.
+ *
+ * <p>This interface should be implemented by OEM and deployed to the target devices.
+ * @see WindowExtensions#getWindowLayoutComponent()
+ */
+public interface WindowAreaComponent {
+
+    /**
+     * WindowArea status constant to signify that the feature is
+     * unsupported on this device. Could be due to the device not supporting that
+     * specific feature.
+     */
+    int STATUS_UNSUPPORTED = 0;
+
+    /**
+     * WindowArea status constant to signify that the feature is
+     * currently unavailable but is supported on this device. This value could signify
+     * that the current device state does not support the specific feature or another
+     * process is currently enabled in that feature.
+     */
+    int STATUS_UNAVAILABLE = 1;
+
+    /**
+     * WindowArea status constant to signify that the feature is
+     * available to be entered or enabled.
+     */
+    int STATUS_AVAILABLE = 2;
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
+    @IntDef({
+            STATUS_UNSUPPORTED,
+            STATUS_UNAVAILABLE,
+            STATUS_AVAILABLE
+    })
+    @interface WindowAreaStatus {}
+
+    /**
+     * Session state constant to represent there being no active session
+     * currently in progress. Used by the library to call the correct callbacks if
+     * a session is ended.
+     */
+    int SESSION_STATE_INACTIVE = 0;
+
+    /**
+     * Session state constant to represent that there is an
+     * active session currently in progress. Used by the library to
+     * know when to return the session object to the developer when the
+     * session is created and active.
+     */
+    int SESSION_STATE_ACTIVE = 1;
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
+    @IntDef({
+            SESSION_STATE_ACTIVE,
+            SESSION_STATE_INACTIVE
+    })
+    @interface WindowAreaSessionState {}
+
+    /**
+     * Adds a listener interested in receiving updates on the RearDisplayStatus
+     * of the device. Because this is being called from the OEM provided
+     * extensions, the library will post the result of the listener on the executor
+     * provided by the developer.
+     *
+     * The listener provided will receive values that
+     * correspond to the [WindowAreaStatus] value that aligns with the current status
+     * of the rear display.
+     * @param consumer interested in receiving updates to WindowAreaStatus.
+     */
+    void addRearDisplayStatusListener(@NonNull Consumer<@WindowAreaStatus Integer> consumer);
+
+    /**
+     * Removes a listener no longer interested in receiving updates.
+     * @param consumer no longer interested in receiving updates to WindowAreaStatus
+     */
+    void removeRearDisplayStatusListener(@NonNull Consumer<@WindowAreaStatus Integer> consumer);
+
+    /**
+     * Creates and starts a rear display session and sends state updates to the
+     * consumer provided. This consumer will receive a constant represented by
+     * [WindowAreaSessionState] to represent the state of the current rear display
+     * session. We will translate the values from the {@link Consumer} to a developer-friendly
+     * interface in the developer facing API.
+     *
+     * Because this is being called from the OEM provided extensions, the library
+     * will post the result of the listener on the executor provided by the developer.
+     *
+     * @param activity to allow that the OEM implementation will use as a base
+     * context and to identify the source display area of the request.
+     * The reference to the activity instance must not be stored in the OEM
+     * implementation to prevent memory leaks.
+     * @param consumer to provide updates to the client on the status of the session
+     * @throws UnsupportedOperationException if this method is called when RearDisplay
+     * mode is not available. This could be to an incompatible device state or when
+     * another process is currently in this mode.
+     */
+    void startRearDisplaySession(@NonNull Activity activity,
+            @NonNull Consumer<@WindowAreaSessionState Integer> consumer);
+
+    /**
+     * Ends a RearDisplaySession and sends [STATE_INACTIVE] to the consumer
+     * provided in the {@code startRearDisplaySession} method. This method is only
+     * called through the {@code RearDisplaySession} provided to the developer.
+     */
+    void endRearDisplaySession();
+}
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..bdca977 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
@@ -36,30 +38,90 @@
 
     /**
      * Updates the rules of embedding activities that are started in the client process.
+     * Since {@link WindowExtensions#VENDOR_API_LEVEL_1}
      */
     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}.
+     * Since {@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 WindowExtensions#VENDOR_API_LEVEL_2}
      */
     void clearSplitInfoCallback();
 
     /**
      * Checks if an activity's' presentation is customized by its or any other process and only
      * occupies a portion of Task bounds.
+     * Since {@link WindowExtensions#VENDOR_API_LEVEL_1}
      */
     boolean isActivityEmbedded(@NonNull Activity activity);
+
+    /**
+     * Sets a function to compute the {@link SplitAttributes} for the {@link SplitRule} and current
+     * window state provided in {@link SplitAttributesCalculatorParams}.
+     * <p>
+     * This method can be used to dynamically configure the split layout properties when new
+     * activities are launched or window properties change.
+     * <p>
+     * If the {@link SplitAttributes} calculator function is not set or is cleared by
+     * {@link #clearSplitAttributesCalculator()}, apps will update its split layout with
+     * registered {@link SplitRule} configurations:
+     * <ul>
+     *     <li>Split with {@link SplitRule#getDefaultSplitAttributes()} if parent task
+     *     container size constraints defined by
+     *     {@link SplitRule#checkParentMetrics(WindowMetrics)} are satisfied</li>
+     *     <li>Occupy the whole parent task bounds if the constraints are not satisfied. </li>
+     * </ul>
+     * <p>
+     * If the function is set, {@link SplitRule#getDefaultSplitAttributes()} and
+     * {@link SplitRule#checkParentMetrics(WindowMetrics)} will be passed to
+     * {@link SplitAttributesCalculatorParams} as
+     * {@link SplitAttributesCalculatorParams#getDefaultSplitAttributes()} and
+     * {@link SplitAttributesCalculatorParams#areDefaultConstraintsSatisfied()} instead, and the
+     * function will be invoked for every device and window state change regardless of the size
+     * constraints. Users can determine to follow the {@link SplitRule} behavior or customize
+     * the {@link SplitAttributes} with the {@link SplitAttributes} calculator function.
+     *
+     * @param calculator the callback to set. It will replace the previously set callback if it
+     *                  exists.
+     * Since {@link 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 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..c741647 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 ce24bad..857738d 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
@@ -22,18 +22,29 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Description of a group of activities stacked on top of each other and shown as a single
  * container, all within the same task.
  */
 public class ActivityStack {
+
     @NonNull
     private final List<Activity> mActivities;
 
     private final boolean mIsEmpty;
 
+    /**
+     * The {@code ActivityStack} constructor
+     *
+     * @param activities {@link Activity Activities} in this application's process that
+     *                   belongs to this {@code ActivityStack}
+     * @param isEmpty Indicates whether there's any {@link Activity} running in this
+     *                {@code ActivityStack}
+     */
     ActivityStack(@NonNull List<Activity> activities, boolean isEmpty) {
+        Objects.requireNonNull(activities);
         mActivities = new ArrayList<>(activities);
         mIsEmpty = isEmpty;
     }
@@ -77,13 +88,15 @@
     @Override
     public int hashCode() {
         int result = (mIsEmpty ? 1 : 0);
-        return result * 31 + mActivities.hashCode();
+        result = result * 31 + mActivities.hashCode();
+        return result;
     }
 
     @NonNull
     @Override
     public String toString() {
         return "ActivityStack{" + "mActivities=" + mActivities
-                + ", mIsEmpty=" + mIsEmpty + '}';
+                + ", mIsEmpty=" + mIsEmpty
+                + '}';
     }
 }
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..9333bdc 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..e4f1e81
--- /dev/null
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
@@ -0,0 +1,582 @@
+/*
+ * 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 android.graphics.Color;
+
+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 default value for animation background color, which means to use the current theme window
+     * background color.
+     *
+     * Only opaque color is supported, so {@code 0} is used as the default. Any other non-opaque
+     * color will be treated as the default.
+     *
+     * @see Builder#setAnimationBackgroundColor(int)
+     */
+    @ColorInt
+    public static final int DEFAULT_ANIMATION_BACKGROUND_COLOR = 0;
+
+    /**
+     * 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.
+     *
+     * The default is {@link #DEFAULT_ANIMATION_BACKGROUND_COLOR}, which means
+     * to use the current theme window background color.
+     *
+     * @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 to use the current 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.
+         *
+         * Only opaque color is supported.
+         *
+         * The default value is {@link #DEFAULT_ANIMATION_BACKGROUND_COLOR}, which
+         * means to use the current theme window background color. Any non-opaque
+         * animation color will be treated as
+         * {@link #DEFAULT_ANIMATION_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) {
+            // Any non-opaque color will be treated as the default.
+            mAnimationBackgroundColor = Color.alpha(color) != 255
+                    ? DEFAULT_ANIMATION_BACKGROUND_COLOR
+                    : 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..80f98fe
--- /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 a897e2f..33b8bb7 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,20 +17,37 @@
 package androidx.window.extensions.embedding;
 
 import androidx.annotation.NonNull;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.embedding.SplitAttributes.SplitType;
+
+import java.util.Objects;
 
 /** Describes a split of two containers with activities. */
 public class SplitInfo {
+
     @NonNull
     private final ActivityStack mPrimaryActivityStack;
     @NonNull
     private final ActivityStack mSecondaryActivityStack;
-    private final float mSplitRatio;
+    @NonNull
+    private final SplitAttributes mSplitAttributes;
 
+    /**
+     * The {@code SplitInfo} constructor.
+     *
+     * @param primaryActivityStack The primary {@link ActivityStack}.
+     * @param secondaryActivityStack The secondary {@link ActivityStack}.
+     * @param splitAttributes The current {@link SplitAttributes} of this split pair.
+     */
     SplitInfo(@NonNull ActivityStack primaryActivityStack,
-            @NonNull ActivityStack secondaryActivityStack, float splitRatio) {
+            @NonNull ActivityStack secondaryActivityStack,
+            @NonNull SplitAttributes splitAttributes) {
+        Objects.requireNonNull(primaryActivityStack);
+        Objects.requireNonNull(secondaryActivityStack);
+        Objects.requireNonNull(splitAttributes);
         mPrimaryActivityStack = primaryActivityStack;
         mSecondaryActivityStack = secondaryActivityStack;
-        mSplitRatio = splitRatio;
+        mSplitAttributes = splitAttributes;
     }
 
     @NonNull
@@ -43,8 +60,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 +89,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 +98,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 +108,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..ada0637 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..38b5451 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..dd02b14 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..9ed7d17 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,76 @@
  * @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}.
+     * Since {@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}.
+     * Since {@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
+     * Since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @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/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..bc8df52
--- /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"
+}
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..932003e
--- /dev/null
+++ b/window/window-demos/demo/src/main/AndroidManifest.xml
@@ -0,0 +1,247 @@
+<?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=".area.RearDisplayActivityConfigChanges"
+            android:exported="true"
+            android:configChanges=
+                "orientation|screenLayout|screenSize|layoutDirection|smallestScreenSize"
+            android:label="@string/rear_display">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <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/area/RearDisplayActivityConfigChanges.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/area/RearDisplayActivityConfigChanges.kt
new file mode 100644
index 0000000..edb2ed1
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/area/RearDisplayActivityConfigChanges.kt
@@ -0,0 +1,136 @@
+/*
+ * 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.demo.area
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
+import androidx.window.area.WindowAreaController
+import androidx.window.area.WindowAreaSession
+import androidx.window.area.WindowAreaSessionCallback
+import androidx.window.area.WindowAreaStatus
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.demo.common.infolog.InfoLogAdapter
+import androidx.window.demo.databinding.ActivityRearDisplayBinding
+import androidx.window.java.area.WindowAreaControllerJavaAdapter
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.Locale
+import java.util.concurrent.Executor
+
+/**
+ * Demo Activity that showcases listening for RearDisplay Status
+ * as well as enabling/disabling RearDisplay mode. This Activity
+ * implements [WindowAreaSessionCallback] for simplicity.
+ *
+ * This Activity overrides configuration changes for simplicity.
+ */
+@OptIn(ExperimentalWindowApi::class)
+class RearDisplayActivityConfigChanges : AppCompatActivity(), WindowAreaSessionCallback {
+
+    private lateinit var windowAreaController: WindowAreaControllerJavaAdapter
+    private var rearDisplaySession: WindowAreaSession? = null
+    private val infoLogAdapter = InfoLogAdapter()
+    private lateinit var binding: ActivityRearDisplayBinding
+    private lateinit var executor: Executor
+
+    private val rearDisplayStatusListener = Consumer<WindowAreaStatus> { status ->
+        infoLogAdapter.append(getCurrentTimeString(), status.toString())
+        infoLogAdapter.notifyDataSetChanged()
+        updateRearDisplayButton(status)
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityRearDisplayBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        executor = ContextCompat.getMainExecutor(this)
+        windowAreaController = WindowAreaControllerJavaAdapter(WindowAreaController.getOrCreate())
+
+        binding.rearStatusRecyclerView.adapter = infoLogAdapter
+
+        binding.rearDisplayButton.setOnClickListener {
+            if (rearDisplaySession != null) {
+                rearDisplaySession?.close()
+            } else {
+                windowAreaController.startRearDisplayModeSession(
+                    this,
+                    executor,
+                    this)
+            }
+        }
+    }
+
+    override fun onStart() {
+        super.onStart()
+        windowAreaController.addRearDisplayStatusListener(
+            executor,
+            rearDisplayStatusListener
+        )
+    }
+
+    override fun onStop() {
+        super.onStop()
+        windowAreaController.removeRearDisplayStatusListener(rearDisplayStatusListener)
+    }
+
+    override fun onSessionStarted(session: WindowAreaSession) {
+        rearDisplaySession = session
+        infoLogAdapter.append(getCurrentTimeString(), "RearDisplay Session has been started")
+        infoLogAdapter.notifyDataSetChanged()
+    }
+
+    override fun onSessionEnded() {
+        rearDisplaySession = null
+        infoLogAdapter.append(getCurrentTimeString(), "RearDisplay Session has ended")
+        infoLogAdapter.notifyDataSetChanged()
+    }
+
+    private fun updateRearDisplayButton(status: WindowAreaStatus) {
+        if (rearDisplaySession != null) {
+            binding.rearDisplayButton.isEnabled = true
+            binding.rearDisplayButton.text = "Disable RearDisplay Mode"
+            return
+        }
+        when (status) {
+            WindowAreaStatus.UNSUPPORTED -> {
+                binding.rearDisplayButton.isEnabled = false
+                binding.rearDisplayButton.text = "RearDisplay is not supported on this device"
+            }
+            WindowAreaStatus.UNAVAILABLE -> {
+                binding.rearDisplayButton.isEnabled = false
+                binding.rearDisplayButton.text = "RearDisplay is not currently available"
+            }
+            WindowAreaStatus.AVAILABLE -> {
+                binding.rearDisplayButton.isEnabled = true
+                binding.rearDisplayButton.text = "Enable RearDisplay Mode"
+            }
+        }
+    }
+
+    private fun getCurrentTimeString(): String {
+        val sdf = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
+        val currentDate = sdf.format(Date())
+        return currentDate.toString()
+    }
+
+    private companion object {
+        private val TAG = RearDisplayActivityConfigChanges::class.java.simpleName
+    }
+}
\ No newline at end of file
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..69542ac
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.GuardedBy
+import androidx.window.embedding.SplitAttributes
+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")
+    private var _animationBackgroundColor = SplitAttributes.BackgroundColor.DEFAULT
+
+    /** Animation background color to use when the animation requires a background. */
+    var animationBackgroundColor: SplitAttributes.BackgroundColor
+        get() = synchronized(lock) {
+            _animationBackgroundColor
+        }
+        set(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..74adead
--- /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.
+ */
+class ExampleWindowInitializer : Initializer<RuleController> {
+    private val mDemoActivityEmbeddingController = DemoActivityEmbeddingController.getInstance()
+
+    @OptIn(ExperimentalWindowApi::class)
+    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..56850b4
--- /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("DEFAULT", "BLUE", "GREEN", "YELLOW")
+        val ANIMATION_BACKGROUND_COLORS_VALUE = arrayOf(
+            SplitAttributes.BackgroundColor.DEFAULT,
+            SplitAttributes.BackgroundColor.color(Color.BLUE),
+            SplitAttributes.BackgroundColor.color(Color.GREEN),
+            SplitAttributes.BackgroundColor.color(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..ab54e1e
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_activity_layout.xml
@@ -0,0 +1,197 @@
+<?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" />
+
+        <CheckBox
+            android:id="@+id/setLaunchingEInActivityStack"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Launch in current container" />
+
+        <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..ded945be 100644
--- a/window/window-java/api/public_plus_experimental_current.txt
+++ b/window/window-java/api/public_plus_experimental_current.txt
@@ -1,9 +1,21 @@
 // Signature format: 4.0
+package androidx.window.java.area {
+
+  @androidx.window.core.ExperimentalWindowApi public final class WindowAreaControllerJavaAdapter implements androidx.window.area.WindowAreaController {
+    ctor public WindowAreaControllerJavaAdapter(androidx.window.area.WindowAreaController controller);
+    method public void addRearDisplayStatusListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.area.WindowAreaStatus> consumer);
+    method public void removeRearDisplayStatusListener(androidx.core.util.Consumer<androidx.window.area.WindowAreaStatus> consumer);
+    method public void startRearDisplayModeSession(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.window.area.WindowAreaSessionCallback windowAreaSessionCallback);
+  }
+
+}
+
 package androidx.window.java.layout {
 
   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/area/WindowAreaControllerJavaAdapter.kt b/window/window-java/src/main/java/androidx/window/java/area/WindowAreaControllerJavaAdapter.kt
new file mode 100644
index 0000000..692d565
--- /dev/null
+++ b/window/window-java/src/main/java/androidx/window/java/area/WindowAreaControllerJavaAdapter.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.window.java.area
+
+import android.app.Activity
+import androidx.core.util.Consumer
+import androidx.window.area.WindowAreaSessionCallback
+import androidx.window.area.WindowAreaStatus
+import androidx.window.area.WindowAreaController
+import androidx.window.core.ExperimentalWindowApi
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import java.util.concurrent.Executor
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * An adapted interface for [WindowAreaController] that provides the information and
+ * functionality around RearDisplay Mode via a callback shaped API.
+ */
+@ExperimentalWindowApi
+class WindowAreaControllerJavaAdapter(
+    private val controller: WindowAreaController
+) : WindowAreaController by controller {
+
+    /**
+     * A [ReentrantLock] to protect against concurrent access to [consumerToJobMap].
+     */
+    private val lock = ReentrantLock()
+    private val consumerToJobMap = mutableMapOf<Consumer<*>, Job>()
+
+    /**
+     * Registers a listener to consume [WindowAreaStatus] values defined as
+     * [WindowAreaStatus.UNSUPPORTED], [WindowAreaStatus.UNAVAILABLE], and
+     * [WindowAreaStatus.AVAILABLE]. The values provided through this listener should be used
+     * to determine if you are able to enable rear display Mode at that time. You can use these
+     * values to modify your UI to show/hide controls and determine when to enable features
+     * that use rear display Mode. You should only try and enter rear display mode when your
+     * [consumer] is provided a value of [WindowAreaStatus.AVAILABLE].
+     *
+     * The [consumer] will be provided an initial value on registration, as well as any change
+     * to the status as they occur. This could happen due to hardware device state changes, or if
+     * another process has enabled RearDisplay Mode.
+     *
+     * @see WindowAreaController.rearDisplayStatus
+     */
+    fun addRearDisplayStatusListener(
+        executor: Executor,
+        consumer: Consumer<WindowAreaStatus>
+    ) {
+        val statusFlow = controller.rearDisplayStatus()
+        lock.withLock {
+            if (consumerToJobMap[consumer] == null) {
+                val scope = CoroutineScope(executor.asCoroutineDispatcher())
+                consumerToJobMap[consumer] = scope.launch {
+                    statusFlow.collect { consumer.accept(it) }
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes a listener of [WindowAreaStatus] values
+     * @see WindowAreaController.rearDisplayStatus
+     */
+    fun removeRearDisplayStatusListener(consumer: Consumer<WindowAreaStatus>) {
+        lock.withLock {
+            consumerToJobMap[consumer]?.cancel()
+            consumerToJobMap.remove(consumer)
+        }
+    }
+
+    /**
+     * Starts a RearDisplay Mode session and provides updates through the
+     * [WindowAreaSessionCallback] provided. Due to the nature of moving your Activity to a
+     * different display, your Activity will likely go through a configuration change. Because of
+     * this, if your Activity does not override configuration changes, this method should be called
+     * from a component that outlives the Activity lifecycle such as a
+     * [androidx.lifecycle.ViewModel]. If your Activity does override
+     * configuration changes, it is safe to call this method inside your Activity.
+     *
+     * This method should only be called if you have received a [WindowAreaStatus.AVAILABLE]
+     * value from the listener provided through the [addRearDisplayStatusListener] method. If
+     * you try and enable RearDisplay mode without it being available, you will receive an
+     * [UnsupportedOperationException].
+     *
+     * The [windowAreaSessionCallback] provided will receive a call to
+     * [WindowAreaSessionCallback.onSessionStarted] after your Activity has been moved to the
+     * display corresponding to this mode. RearDisplay mode will stay active until the session
+     * provided through [WindowAreaSessionCallback.onSessionStarted] is closed, or there is a device
+     * state change that makes RearDisplay mode incompatible such as if the device is closed so the
+     * outer-display is no longer in line with the rear camera. When this occurs,
+     * [WindowAreaSessionCallback.onSessionEnded] is called to notify you the session has been
+     * ended.
+     *
+     * @see addRearDisplayStatusListener
+     * @throws UnsupportedOperationException if you try and start a RearDisplay session when
+     * your [WindowAreaController.rearDisplayStatus] does not return a value of
+     * [WindowAreaStatus.AVAILABLE]
+     */
+    fun startRearDisplayModeSession(
+        activity: Activity,
+        executor: Executor,
+        windowAreaSessionCallback: WindowAreaSessionCallback
+    ) {
+        controller.rearDisplayMode(activity, executor, windowAreaSessionCallback)
+    }
+}
\ No newline at end of file
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 a1e039c..c280797 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,6 +42,7 @@
     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 {
@@ -61,6 +63,8 @@
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -79,6 +83,92 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final androidx.window.embedding.SplitAttributes.BackgroundColor 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.BackgroundColor {
+    method public static androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor DEFAULT;
+  }
+
+  public static final class SplitAttributes.BackgroundColor.Companion {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+  }
+
+  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(androidx.window.embedding.SplitAttributes.BackgroundColor 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);
@@ -95,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 {
@@ -116,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;
   }
@@ -152,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
@@ -188,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 {
@@ -237,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;
   }
@@ -257,7 +357,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 3973329..0d9042f 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -4,6 +4,41 @@
   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";
+  }
+
+}
+
+package androidx.window.area {
+
+  @androidx.window.core.ExperimentalWindowApi public interface WindowAreaController {
+    method public default static androidx.window.area.WindowAreaController getOrCreate();
+    method public void rearDisplayMode(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.window.area.WindowAreaSessionCallback windowAreaSessionCallback);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.area.WindowAreaStatus> rearDisplayStatus();
+    field public static final androidx.window.area.WindowAreaController.Companion Companion;
+  }
+
+  public static final class WindowAreaController.Companion {
+    method public androidx.window.area.WindowAreaController getOrCreate();
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public interface WindowAreaSession {
+    method public void close();
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public interface WindowAreaSessionCallback {
+    method public void onSessionEnded();
+    method public void onSessionStarted(androidx.window.area.WindowAreaSession session);
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class WindowAreaStatus {
+    field public static final androidx.window.area.WindowAreaStatus AVAILABLE;
+    field public static final androidx.window.area.WindowAreaStatus.Companion Companion;
+    field public static final androidx.window.area.WindowAreaStatus UNAVAILABLE;
+    field public static final androidx.window.area.WindowAreaStatus UNSUPPORTED;
+  }
+
+  public static final class WindowAreaStatus.Companion {
   }
 
 }
@@ -48,6 +83,7 @@
     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 {
@@ -68,6 +104,8 @@
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -86,11 +124,100 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final androidx.window.embedding.SplitAttributes.BackgroundColor 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.BackgroundColor {
+    method public static androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor DEFAULT;
+  }
+
+  public static final class SplitAttributes.BackgroundColor.Companion {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+  }
+
+  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(androidx.window.embedding.SplitAttributes.BackgroundColor 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;
   }
 
@@ -102,10 +229,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 {
@@ -123,35 +250,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;
   }
@@ -159,33 +287,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
@@ -195,6 +321,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 {
@@ -244,6 +380,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;
   }
@@ -265,7 +402,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 a1e039c..c280797 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,6 +42,7 @@
     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 {
@@ -61,6 +63,8 @@
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -79,6 +83,92 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final androidx.window.embedding.SplitAttributes.BackgroundColor 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.BackgroundColor {
+    method public static androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.BackgroundColor DEFAULT;
+  }
+
+  public static final class SplitAttributes.BackgroundColor.Companion {
+    method public androidx.window.embedding.SplitAttributes.BackgroundColor color(@ColorInt @IntRange(from=android.graphics.Color.BLACK.toLong(), to=android.graphics.Color.WHITE.toLong()) int color);
+  }
+
+  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(androidx.window.embedding.SplitAttributes.BackgroundColor 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);
@@ -95,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 {
@@ -116,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;
   }
@@ -152,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
@@ -188,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 {
@@ -237,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;
   }
@@ -257,7 +357,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..e44e0ac
--- /dev/null
+++ b/window/window/samples/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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"))
+    implementation("androidx.core:core:1.8.0")
+}
+
+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..2cba736
--- /dev/null
+++ b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
@@ -0,0 +1,144 @@
+/*
+ * 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.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(SplitAttributes.BackgroundColor.color(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(SplitAttributes.BackgroundColor.color(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(SplitAttributes.BackgroundColor.color(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(SplitAttributes.BackgroundColor.color(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/area/WindowAreaControllerImplTest.kt b/window/window/src/androidTest/java/androidx/window/area/WindowAreaControllerImplTest.kt
new file mode 100644
index 0000000..3b10142
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/area/WindowAreaControllerImplTest.kt
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.area
+
+import android.annotation.TargetApi
+import android.app.Activity
+import android.content.pm.ActivityInfo
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.window.TestActivity
+import androidx.window.TestConsumer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.extensions.area.WindowAreaComponent
+import androidx.window.extensions.core.util.function.Consumer
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import org.junit.Assume.assumeTrue
+import org.junit.Rule
+import org.junit.Test
+import kotlin.test.assertFailsWith
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runTest
+
+@OptIn(ExperimentalCoroutinesApi::class, ExperimentalWindowApi::class)
+class WindowAreaControllerImplTest {
+
+    @get:Rule
+    public val activityScenario: ActivityScenarioRule<TestActivity> =
+        ActivityScenarioRule(TestActivity::class.java)
+
+    private val testScope = TestScope(UnconfinedTestDispatcher())
+
+    @TargetApi(Build.VERSION_CODES.N)
+    @Test
+    public fun testRearDisplayStatus(): Unit = testScope.runTest {
+        assumeTrue(Build.VERSION.SDK_INT > Build.VERSION_CODES.N)
+        activityScenario.scenario.onActivity {
+            val extensionComponent = FakeWindowAreaComponent()
+            val repo = WindowAreaControllerImpl(extensionComponent)
+            val collector = TestConsumer<WindowAreaStatus>()
+            extensionComponent
+                .updateStatusListeners(WindowAreaComponent.STATUS_UNAVAILABLE)
+            testScope.launch(Job()) {
+                repo.rearDisplayStatus().collect(collector::accept)
+            }
+            collector.assertValue(WindowAreaStatus.UNAVAILABLE)
+            extensionComponent
+                .updateStatusListeners(WindowAreaComponent.STATUS_AVAILABLE)
+            collector.assertValues(
+                WindowAreaStatus.UNAVAILABLE,
+                WindowAreaStatus.AVAILABLE
+            )
+        }
+    }
+
+    @Test
+    public fun testRearDisplayStatusNullComponent(): Unit = testScope.runTest {
+        activityScenario.scenario.onActivity {
+            val repo = EmptyWindowAreaControllerImpl()
+            val collector = TestConsumer<WindowAreaStatus>()
+            testScope.launch(Job()) {
+                repo.rearDisplayStatus().collect(collector::accept)
+            }
+            collector.assertValue(WindowAreaStatus.UNSUPPORTED)
+        }
+    }
+
+    /**
+     * Tests the rear display mode flow works as expected. Tests the flow
+     * through WindowAreaControllerImpl with a fake extension. This fake extension
+     * changes the orientation of the activity to landscape when rear display mode is enabled
+     * and then returns it back to portrait when it's disabled.
+     */
+    @TargetApi(Build.VERSION_CODES.N)
+    @Test
+    public fun testRearDisplayMode(): Unit = testScope.runTest {
+        assumeTrue(Build.VERSION.SDK_INT > Build.VERSION_CODES.N)
+        val extensions = FakeWindowAreaComponent()
+        val repo = WindowAreaControllerImpl(extensions)
+        extensions.currentStatus = WindowAreaComponent.STATUS_AVAILABLE
+        val callback = TestWindowAreaSessionCallback()
+        activityScenario.scenario.onActivity { testActivity ->
+            testActivity.resetLayoutCounter()
+            testActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+            testActivity.waitForLayout()
+        }
+
+        activityScenario.scenario.onActivity { testActivity ->
+            assert(testActivity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
+            testActivity.resetLayoutCounter()
+            repo.rearDisplayMode(testActivity, Runnable::run, callback)
+        }
+
+        activityScenario.scenario.onActivity { testActivity ->
+            assert(testActivity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
+            assert(callback.currentSession != null)
+            testActivity.resetLayoutCounter()
+            callback.endSession()
+        }
+        activityScenario.scenario.onActivity { testActivity ->
+            assert(testActivity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
+            assert(callback.currentSession == null)
+        }
+    }
+
+    @TargetApi(Build.VERSION_CODES.N)
+    @Test
+    public fun testRearDisplayModeReturnsError(): Unit = testScope.runTest {
+        assumeTrue(Build.VERSION.SDK_INT > Build.VERSION_CODES.N)
+        val extensionComponent = FakeWindowAreaComponent()
+        extensionComponent.currentStatus = WindowAreaComponent.STATUS_UNAVAILABLE
+        val repo = WindowAreaControllerImpl(extensionComponent)
+        val callback = TestWindowAreaSessionCallback()
+        activityScenario.scenario.onActivity { testActivity ->
+            assertFailsWith(
+                exceptionClass = UnsupportedOperationException::class,
+                block = { repo.rearDisplayMode(testActivity, Runnable::run, callback) }
+            )
+        }
+    }
+
+    @TargetApi(Build.VERSION_CODES.N)
+    @Test
+    public fun testRearDisplayModeNullComponent(): Unit = testScope.runTest {
+        assumeTrue(Build.VERSION.SDK_INT > Build.VERSION_CODES.N)
+        val repo = EmptyWindowAreaControllerImpl()
+        val callback = TestWindowAreaSessionCallback()
+        activityScenario.scenario.onActivity { testActivity ->
+            assertFailsWith(
+                exceptionClass = UnsupportedOperationException::class,
+                block = { repo.rearDisplayMode(testActivity, Runnable::run, callback) }
+            )
+        }
+    }
+
+    private class FakeWindowAreaComponent : WindowAreaComponent {
+        val statusListeners = mutableListOf<Consumer<Int>>()
+        var currentStatus = WindowAreaComponent.STATUS_UNSUPPORTED
+        var testActivity: Activity? = null
+        var sessionConsumer: Consumer<Int>? = null
+
+        @RequiresApi(Build.VERSION_CODES.N)
+        override fun addRearDisplayStatusListener(consumer: Consumer<Int>) {
+            statusListeners.add(consumer)
+            consumer.accept(currentStatus)
+        }
+
+        override fun removeRearDisplayStatusListener(consumer: Consumer<Int>) {
+            statusListeners.remove(consumer)
+        }
+
+        // Fake WindowAreaComponent will change the orientation of the activity to signal
+        // entering rear display mode, as well as ending the session
+        @RequiresApi(Build.VERSION_CODES.N)
+        override fun startRearDisplaySession(
+            activity: Activity,
+            rearDisplaySessionConsumer: Consumer<Int>
+        ) {
+            if (currentStatus != WindowAreaComponent.STATUS_AVAILABLE) {
+                throw UnsupportedOperationException("Rear Display mode cannot be enabled currently")
+            }
+            testActivity = activity
+            sessionConsumer = rearDisplaySessionConsumer
+            testActivity!!.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+            rearDisplaySessionConsumer.accept(WindowAreaComponent.SESSION_STATE_ACTIVE)
+        }
+
+        @RequiresApi(Build.VERSION_CODES.N)
+        override fun endRearDisplaySession() {
+            testActivity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+            sessionConsumer?.accept(WindowAreaComponent.SESSION_STATE_INACTIVE)
+        }
+
+        @RequiresApi(Build.VERSION_CODES.N)
+        fun updateStatusListeners(newStatus: Int) {
+            currentStatus = newStatus
+            for (consumer in statusListeners) {
+                consumer.accept(currentStatus)
+            }
+        }
+    }
+
+    private class TestWindowAreaSessionCallback : WindowAreaSessionCallback {
+
+        var currentSession: WindowAreaSession? = null
+        var error: Throwable? = null
+
+        override fun onSessionStarted(session: WindowAreaSession) {
+            currentSession = session
+        }
+
+        override fun onSessionEnded() {
+            currentSession = null
+        }
+
+        fun endSession() = currentSession?.close()
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
index 1d9d74c..44e9c5b 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
@@ -52,16 +52,20 @@
     }
 
     @Test
-    fun testMatchActivity_MatchIntentWithoutAction() {
+    fun testMatch_WithoutAction() {
         val filter = ActivityFilter(COMPONENT_1, null /* intentAction */)
 
         assertWithMessage("#matchActivity must be true because intent.component matches")
             .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage("#matchIntent must be true because intent.component matches")
+            .that(filter.matchesIntent(intent)).isTrue()
 
         intent.component = COMPONENT_2
 
         assertWithMessage("#matchActivity must be false because component mismatches")
             .that(filter.matchesActivity(activity)).isFalse()
+        assertWithMessage("#matchesIntent must be false because component mismatches")
+            .that(filter.matchesIntent(intent)).isFalse()
 
         doReturn(COMPONENT_1).whenever(activity).componentName
 
@@ -70,29 +74,37 @@
     }
 
     @Test
-    fun testMatchActivity_MatchIntentWithAction() {
+    fun testMatch_WithAction() {
         val filter = ActivityFilter(COMPONENT_1, ACTION)
 
         assertWithMessage("#matchActivity must be false because intent has no action")
             .that(filter.matchesActivity(activity)).isFalse()
+        assertWithMessage("#matchesIntent must be false because intent has no action")
+            .that(filter.matchesIntent(intent)).isFalse()
 
         intent.action = ACTION
 
         assertWithMessage("#matchActivity must be true because intent matches")
             .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage("#matchesIntent must be true because intent matches")
+            .that(filter.matchesIntent(intent)).isTrue()
     }
 
     @Test
-    fun testMatchActivity_MatchWildcardWithAction() {
+    fun testMatch_WildcardWithAction() {
         val filter = ActivityFilter(WILDCARD, ACTION)
 
         assertWithMessage("#matchActivity must be false because intent has no action")
             .that(filter.matchesActivity(activity)).isFalse()
+        assertWithMessage("#matchesIntent must be false because intent has no action")
+            .that(filter.matchesIntent(intent)).isFalse()
 
         intent.action = ACTION
 
         assertWithMessage("#matchActivity must be true because intent.action matches")
             .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage("#matchesIntent must be true because intent.action matches")
+            .that(filter.matchesIntent(intent)).isTrue()
 
         intent.component = null
 
@@ -101,10 +113,15 @@
                 "of null component"
         )
             .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage(
+            "#matchesIntent must be true because intent.action matches regardless " +
+                "of null component"
+        )
+            .that(filter.matchesIntent(intent)).isTrue()
     }
 
     @Test
-    fun testMatchActivity_MatchIntentWithPackage() {
+    fun testMatch_IntentWithPackage() {
         val filter = ActivityFilter(WILDCARD, null /* intentAction */)
 
         intent.component = null
@@ -112,6 +129,20 @@
 
         assertWithMessage("#matchActivity must be true because intent.package matches")
             .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage("#matchesIntent must be true because intent.package matches")
+            .that(filter.matchesIntent(intent)).isTrue()
+    }
+
+    @Test
+    fun testMatch_EmptyIntentWithWildcard() {
+        val filter = ActivityFilter(WILDCARD, null /* intentAction */)
+
+        intent.component = null
+
+        assertWithMessage("#matchActivity must be true because rule is wildcard to match all")
+            .that(filter.matchesActivity(activity)).isTrue()
+        assertWithMessage("#matchesIntent must be true because rule is wildcard to match all")
+            .that(filter.matchesIntent(intent)).isTrue()
     }
 
     companion object {
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..0ce0920
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
@@ -0,0 +1,166 @@
+/*
+ * 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.app.Activity
+import android.graphics.Color
+import androidx.window.WindowTestUtils
+import androidx.window.core.ExtensionsUtil
+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 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 oemSplitInfo = createTestOEMSplitInfo(
+            createTestOEMActivityStack(ArrayList(), true),
+            createTestOEMActivityStack(ArrayList(), true),
+            OEMSplitAttributes.Builder().build(),
+        )
+        val expectedSplitInfo = SplitInfo(
+            ActivityStack(ArrayList(), isEmpty = true),
+            ActivityStack(ArrayList(), isEmpty = true),
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.splitEqually())
+                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+
+    @Test
+    fun testTranslateSplitInfoWithExpandingContainers() {
+        WindowTestUtils.assumeAtLeastVendorApiLevel(WindowExtensions.VENDOR_API_LEVEL_2)
+
+        val oemSplitInfo = createTestOEMSplitInfo(
+            createTestOEMActivityStack(ArrayList(), true),
+            createTestOEMActivityStack(ArrayList(), true),
+            OEMSplitAttributes.Builder()
+                .setSplitType(OEMSplitAttributes.SplitType.ExpandContainersSplitType())
+                .build(),
+        )
+        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 activityStack = createTestOEMActivityStack(ArrayList(), true)
+        val expectedSplitRatio = 0.3f
+        val oemSplitInfo = mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(activityStack)
+            whenever(secondaryActivityStack).thenReturn(activityStack)
+            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 oemSplitInfo = createTestOEMSplitInfo(
+            createTestOEMActivityStack(ArrayList(), true),
+            createTestOEMActivityStack(ArrayList(), true),
+            OEMSplitAttributes.Builder()
+                .setSplitType(
+                    OEMSplitAttributes.SplitType.HingeSplitType(
+                        OEMSplitAttributes.SplitType.RatioSplitType(0.3f)
+                    )
+                ).setLayoutDirection(TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(Color.YELLOW)
+                .build(),
+        )
+        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(SplitAttributes.BackgroundColor.color(Color.YELLOW))
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+
+    private fun createTestOEMSplitInfo(
+        testPrimaryActivityStack: OEMActivityStack,
+        testSecondaryActivityStack: OEMActivityStack,
+        testSplitAttributes: OEMSplitAttributes,
+    ): OEMSplitInfo {
+        return mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(testPrimaryActivityStack)
+            whenever(secondaryActivityStack).thenReturn(testSecondaryActivityStack)
+            if (ExtensionsUtil.safeVendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2) {
+                whenever(splitAttributes).thenReturn(testSplitAttributes)
+            }
+        }
+    }
+
+    private fun createTestOEMActivityStack(
+        testActivities: List<Activity>,
+        testIsEmpty: Boolean,
+    ): OEMActivityStack {
+        return mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(testActivities)
+            whenever(isEmpty).thenReturn(testIsEmpty)
+        }
+    }
+}
\ 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 a60f358..582d047 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.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(SplitAttributes.BackgroundColor.DEFAULT)
+            .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(ALWAYS_DISALLOW, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ALWAYS, rule.finishPrimaryWithSecondary)
-        assertEquals(FINISH_NEVER, rule.finishSecondaryWithPrimary)
+        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(SplitAttributes.BackgroundColor.color(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(SplitAttributes.BackgroundColor.DEFAULT)
+            .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(SplitAttributes.BackgroundColor.color(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,6 +262,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
@@ -214,6 +275,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ALWAYS_DISALLOW)
@@ -229,6 +291,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ratio(1.1f))
@@ -257,6 +320,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
@@ -269,6 +333,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ALWAYS_DISALLOW)
@@ -284,6 +349,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ratio(1.1f))
@@ -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(SplitAttributes.BackgroundColor.DEFAULT)
+            .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,45 @@
             .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(ALWAYS_DISALLOW, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ADJACENT, rule.finishPrimaryWithPlaceholder)
+        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(SplitAttributes.BackgroundColor.color(
+                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 +455,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(SplitAttributes.BackgroundColor.DEFAULT)
+            .build()
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
         assertTrue(rule.checkParentBounds(density, minValidWindowBounds()))
         assertFalse(rule.checkParentBounds(density, almostValidWindowBounds()))
     }
@@ -378,24 +487,31 @@
             )
         )
         val intent = Intent("ACTION")
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.3f))
+            .setLayoutDirection(LEFT_TO_RIGHT)
+            .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(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 +525,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,6 +572,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
@@ -472,6 +585,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ALWAYS_DISALLOW)
@@ -487,6 +601,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ratio(1.1f))
@@ -515,6 +630,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
@@ -530,6 +646,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ALWAYS_DISALLOW)
@@ -545,6 +662,7 @@
         // 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(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ratio(1.1f))
@@ -573,7 +691,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 +705,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 +730,7 @@
     @Test
     fun testDefaults_ActivityRule_Builder() {
         val rule = ActivityRule.Builder(HashSet()).build()
-        assertEquals(false, rule.alwaysExpand)
+        assertFalse(rule.alwaysExpand)
     }
 
     /**
@@ -613,8 +747,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 +771,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/embedding/SafeActivityEmbeddingComponentProviderTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt
new file mode 100644
index 0000000..3b93a9a
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SafeActivityEmbeddingComponentProviderTest.kt
@@ -0,0 +1,79 @@
+/*
+ * 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.embedding
+
+import android.util.Log
+import androidx.window.core.ConsumerAdapter
+import androidx.window.extensions.WindowExtensions
+import androidx.window.extensions.WindowExtensionsProvider
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+/**
+ * An integration test to verify that if [WindowExtensionsProvider] is present then
+ * [SafeActivityEmbeddingComponentProvider.activityEmbeddingComponent] will return a value.
+ * This can fail if the implementation of window:extensions:extensions
+ * does not have the expected API.
+ */
+class SafeActivityEmbeddingComponentProviderTest {
+
+    /**
+     * Test that if [WindowExtensionsProvider] is available then
+     * use [SafeActivityEmbeddingComponentProvider.activityEmbeddingComponent] to validate.
+     * If [WindowExtensions.getActivityEmbeddingComponent] matches contract,
+     * return a non-null value.
+     * If it doesn't match, it will return a null.
+     *
+     *  TODO(b/267708462) : add a more reliable test
+     */
+    @Test
+    fun activityEmbeddingComponentIsAvailable_ifProviderIsAvailable() {
+        val loader = SafeActivityEmbeddingComponentProviderTest::class.java.classLoader!!
+        val consumerAdapter = ConsumerAdapter(loader)
+        val windowExtensions: WindowExtensions = try {
+            WindowExtensionsProvider.getWindowExtensions()
+        } catch (e: UnsupportedOperationException) {
+            Log.d(TAG, "Device doesn't have WindowExtensions available")
+            return
+        }
+        val safeComponent = SafeActivityEmbeddingComponentProvider(
+            loader,
+            consumerAdapter,
+            windowExtensions
+        )
+            .activityEmbeddingComponent
+        try {
+            val actualComponent = windowExtensions.activityEmbeddingComponent
+            if (actualComponent == null) {
+                assertNull(safeComponent)
+            } else {
+                // TODO(b/267573854) : verify upon each api level
+                // TODO(b/267708462) : more reliable test for testing actual method matching
+                if (safeComponent == null) {
+                    Log.d(TAG, "ActivityEmbeddingComponent on device doesn't match our constraints")
+                }
+            }
+        } catch (e: UnsupportedOperationException) {
+            // Invalid implementation of extensions
+            assertNull(safeComponent)
+        }
+    }
+
+    companion object {
+        private const val TAG = "SafeActivityEmbeddingComponentProviderTest"
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
new file mode 100644
index 0000000..69c507d
--- /dev/null
+++ b/window/window/src/androidTest/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(SplitAttributes.BackgroundColor.DEFAULT)
+            .build()
+        val attrs2 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
+            .build()
+        val attrs3 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
+            .build()
+        val attrs4 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GREEN))
+            .build()
+        val attrs5 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(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/androidTest/java/androidx/window/embedding/SplitPairFilterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SplitPairFilterTest.kt
index 408102b..4c75bd7 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/SplitPairFilterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SplitPairFilterTest.kt
@@ -22,43 +22,122 @@
 import com.google.common.truth.Truth.assertWithMessage
 import com.nhaarman.mockitokotlin2.doReturn
 import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import org.junit.Before
 import org.junit.Test
 
 class SplitPairFilterTest {
-    private val component1 = ComponentName("a.b.c", "a.b.c.TestActivity")
-    private val component2 = ComponentName("d.e.f", "d.e.f.TestActivity")
-    private val intentClassWildcard = ComponentName("d.e.f", "*")
-    private val intent = Intent()
-    private val activity = mock<Activity> {
-        on { intent } doReturn intent
-        on { componentName } doReturn component1
+    private val intent1 = Intent()
+    private val intent2 = Intent()
+    private val activity1 = mock<Activity> {
+        on { intent } doReturn intent1
+        on { componentName } doReturn COMPONENT_1
     }
-    private val filter =
-        SplitPairFilter(component1, intentClassWildcard, null /* secondaryActivityIntentAction */)
+    private val activity2 = mock<Activity> {
+        on { intent } doReturn intent2
+        on { componentName } doReturn COMPONENT_2
+    }
 
-    @Test
-    fun testMatchActivityIntentPair_MatchIntentComponent() {
-        assertWithMessage("#matchesActivityIntentPair must be false because intent is empty")
-            .that(filter.matchesActivityIntentPair(activity, intent)).isFalse()
-
-        intent.component = component2
-
-        assertWithMessage("#matchesActivityIntentPair must be true because intent.component" +
-            " matches")
-            .that(filter.matchesActivityIntentPair(activity, intent)).isTrue()
+    @Before
+    fun setUp() {
+        intent1.component = COMPONENT_1
+        intent2.component = COMPONENT_2
     }
 
     @Test
-    fun testMatchActivityIntentPair_MatchIntentPackage() {
-        intent.`package` = intentClassWildcard.packageName
+    fun testMatch_WithoutAction() {
+        val filter = SplitPairFilter(
+            COMPONENT_1,
+            COMPONENT_2,
+            null /* secondaryActivityIntentAction */
+        )
 
+        assertWithMessage("#matchesActivityPair must be true because intents match")
+            .that(filter.matchesActivityPair(activity1, activity2)).isTrue()
+        assertWithMessage("#matchesActivityIntentPair must be true because intents match")
+            .that(filter.matchesActivityIntentPair(activity1, intent2)).isTrue()
+
+        assertWithMessage("#matchesActivityPair must be false because secondary doesn't match")
+            .that(filter.matchesActivityPair(activity1, activity1)).isFalse()
+        assertWithMessage(
+            "#matchesActivityIntentPair must be false because secondary doesn't match"
+        )
+            .that(filter.matchesActivityIntentPair(activity1, intent1)).isFalse()
+
+        assertWithMessage("#matchesActivityPair must be false because primary doesn't match")
+            .that(filter.matchesActivityPair(activity2, activity2)).isFalse()
+        assertWithMessage(
+            "#matchesActivityIntentPair must be false because primary doesn't match"
+        )
+            .that(filter.matchesActivityIntentPair(activity2, intent2)).isFalse()
+    }
+
+    @Test
+    fun testMatch_WithAction() {
+        val filter = SplitPairFilter(COMPONENT_1, WILDCARD, ACTION)
+
+        assertWithMessage("#matchesActivityPair must be false because intent has no action")
+            .that(filter.matchesActivityPair(activity1, activity2)).isFalse()
+        assertWithMessage("#matchesActivityIntentPair must be false because intent has no action")
+            .that(filter.matchesActivityIntentPair(activity1, intent2)).isFalse()
+
+        intent2.action = ACTION
+
+        assertWithMessage("#matchesActivityPair must be true because intent.action matches")
+            .that(filter.matchesActivityPair(activity1, activity2)).isTrue()
+        assertWithMessage("#matchesActivityIntentPair must be true because intent.action matches")
+            .that(filter.matchesActivityIntentPair(activity1, intent2)).isTrue()
+    }
+
+    @Test
+    fun testMatch_WithIntentPackage() {
+        val filter = SplitPairFilter(
+            COMPONENT_1,
+            CLASS_WILDCARD,
+            null /* secondaryActivityIntentAction */
+        )
+        intent2.component = null
+        intent2.`package` = CLASS_WILDCARD.packageName
+        doReturn(COMPONENT_1).whenever(activity2).componentName
+
+        assertWithMessage("#matchesActivityPair must be true because intent.package matches")
+            .that(filter.matchesActivityPair(activity1, activity2)).isTrue()
         assertWithMessage("#matchesActivityIntentPair must be true because intent.package matches")
-            .that(filter.matchesActivityIntentPair(activity, intent)).isTrue()
+            .that(filter.matchesActivityIntentPair(activity1, intent2)).isTrue()
 
-        intent.component = component1
+        intent2.component = COMPONENT_1
 
-        assertWithMessage("#matchesActivityIntentPair must be false because intent.component" +
-            " doesn't match")
-            .that(filter.matchesActivityIntentPair(activity, intent)).isFalse()
+        assertWithMessage(
+            "#matchesActivityPair must be false because intent.component doesn't match"
+        )
+            .that(filter.matchesActivityPair(activity1, activity1)).isFalse()
+        assertWithMessage(
+            "#matchesActivityIntentPair must be false because intent.component doesn't match"
+        )
+            .that(filter.matchesActivityIntentPair(activity1, intent1)).isFalse()
+    }
+
+    @Test
+    fun testMatch_EmptyIntentWithWildcard() {
+        val filter = SplitPairFilter(
+            WILDCARD,
+            WILDCARD,
+            null /* secondaryActivityIntentAction */
+        )
+        intent1.component = null
+        intent2.component = null
+
+        assertWithMessage("#matchesActivityPair must be true because rule is wildcard")
+            .that(filter.matchesActivityPair(activity1, activity2)).isTrue()
+        assertWithMessage("#matchesActivityIntentPair must be true because rule is wildcard")
+            .that(filter.matchesActivityIntentPair(activity1, intent2)).isTrue()
+    }
+
+    companion object {
+        private const val ACTION = "action.test"
+        private val COMPONENT_1 = ComponentName("a.b.c", "a.b.c.TestActivity")
+        private val COMPONENT_2 = ComponentName("d.e.f", "d.e.f.TestActivity")
+        private val WILDCARD = ComponentName("*", "*")
+        private val CLASS_WILDCARD = ComponentName("d.e.f", "*")
     }
 }
\ 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/SafeWindowLayoutComponentProviderTest.kt b/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
index 246e9a3..bc78a38 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.window.layout
 
+import android.util.Log
 import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.WindowExtensionsProvider
-import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNull
 import org.junit.Test
 
@@ -46,11 +46,17 @@
             if (actualComponent == null) {
                 assertNull(safeComponent)
             } else {
-                assertNotNull(safeComponent)
+                // TODO(b/267831038): verify upon each api level
+                // TODO(b/267708462): more reliable test for testing actual method matching
+                Log.d(TAG, "WindowLayoutComponent on device doesn't match our constraints")
             }
         } catch (e: UnsupportedOperationException) {
             // Invalid implementation of extensions
             assertNull(safeComponent)
         }
     }
+
+    companion object {
+        private const val TAG = "SafeWindowLayoutComponentProviderTest"
+    }
 }
\ 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/area/EmptyWindowAreaControllerImpl.kt b/window/window/src/main/java/androidx/window/area/EmptyWindowAreaControllerImpl.kt
new file mode 100644
index 0000000..d56eccb
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/EmptyWindowAreaControllerImpl.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.window.area
+
+import android.app.Activity
+import androidx.window.core.ExperimentalWindowApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOf
+import java.util.concurrent.Executor
+
+/**
+ * Empty Implementation for devices that do not
+ * support the [WindowAreaController] functionality
+ */
+@ExperimentalWindowApi
+internal class EmptyWindowAreaControllerImpl : WindowAreaController {
+    override fun rearDisplayStatus(): Flow<WindowAreaStatus> {
+        return flowOf(WindowAreaStatus.UNSUPPORTED)
+    }
+
+    override fun rearDisplayMode(
+        activity: Activity,
+        executor: Executor,
+        windowAreaSessionCallback: WindowAreaSessionCallback
+    ) {
+        // TODO(b/269144982): Investigate not throwing an exception
+        throw UnsupportedOperationException("Rear Display mode cannot be enabled currently")
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.kt b/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.kt
new file mode 100644
index 0000000..ae7d3ca
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/RearDisplaySessionImpl.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.area
+
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.extensions.area.WindowAreaComponent
+
+@ExperimentalWindowApi
+internal class RearDisplaySessionImpl(
+    private val windowAreaComponent: WindowAreaComponent
+) : WindowAreaSession {
+
+    override fun close() {
+        windowAreaComponent.endRearDisplaySession()
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaAdapter.kt b/window/window/src/main/java/androidx/window/area/WindowAreaAdapter.kt
new file mode 100644
index 0000000..65154449
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaAdapter.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.window.area
+
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.extensions.area.WindowAreaComponent
+
+/**
+ * Adapter object to assist in translating values received from [WindowAreaComponent]
+ * to developer friendly values in [WindowAreaController]
+ */
+@ExperimentalWindowApi
+internal object WindowAreaAdapter {
+
+    internal fun translate(status: @WindowAreaComponent.WindowAreaStatus Int): WindowAreaStatus {
+        return when (status) {
+            WindowAreaComponent.STATUS_AVAILABLE -> WindowAreaStatus.AVAILABLE
+            WindowAreaComponent.STATUS_UNAVAILABLE -> WindowAreaStatus.UNAVAILABLE
+            else -> WindowAreaStatus.UNSUPPORTED
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaController.kt b/window/window/src/main/java/androidx/window/area/WindowAreaController.kt
new file mode 100644
index 0000000..385b290
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaController.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.area
+
+import android.app.Activity
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RestrictTo
+import androidx.window.core.BuildConfig
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.core.VerificationMode
+import androidx.window.extensions.WindowExtensionsProvider
+import androidx.window.extensions.area.WindowAreaComponent
+import java.util.concurrent.Executor
+import kotlinx.coroutines.flow.Flow
+
+/**
+ * An interface to provide information about available window areas on the device and an option
+ * to use the rear display area of a foldable device, exclusively or concurrently with the internal
+ * display.
+ */
+@ExperimentalWindowApi
+interface WindowAreaController {
+
+    /**
+     * Provides information about the current state of the window area of the rear display on the
+     * device, if or when it is available. Rear Display mode can be invoked if the current status is
+     * [WindowAreaStatus.AVAILABLE].
+     */
+    fun rearDisplayStatus(): Flow<WindowAreaStatus>
+
+    /**
+     * Starts Rear Display Mode and moves the provided activity to the rear side of the device in
+     * order to face the same direction as the primary device camera(s). When a rear display
+     * mode is started, the system will turn on the rear display of the device to show the content
+     * there, and can disable the internal display. The provided [Activity] is likely to get a
+     * configuration change or being relaunched due to the difference in the internal and rear
+     * display sizes on the device.
+     * <p>Only the top visible application can request and use this mode. The system can dismiss the
+     * mode if the user changes the device state.
+     * <p>This method can only be called if the feature is supported on the device and is reported
+     * as available in the current state through [rearDisplayStatus], otherwise it will
+     * throw an [Exception].
+     */
+    fun rearDisplayMode(
+        activity: Activity,
+        executor: Executor,
+        windowAreaSessionCallback: WindowAreaSessionCallback
+    )
+
+    public companion object {
+        private val TAG = WindowAreaController::class.simpleName
+
+        private var decorator: WindowAreaControllerDecorator = EmptyDecorator
+
+        /**
+         * Provides an instance of [WindowAreaController].
+         */
+        @JvmName("getOrCreate")
+        @JvmStatic
+        fun getOrCreate(): WindowAreaController {
+            var windowAreaComponentExtensions: WindowAreaComponent?
+            try {
+                // TODO(b/267972002): Introduce reflection guard for WindowAreaComponent
+                windowAreaComponentExtensions = WindowExtensionsProvider
+                    .getWindowExtensions()
+                    .windowAreaComponent
+            } catch (t: Throwable) {
+                if (BuildConfig.verificationMode == VerificationMode.STRICT) {
+                    Log.d(TAG, "Failed to load WindowExtensions")
+                }
+                windowAreaComponentExtensions = null
+            }
+            val controller =
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N ||
+                    windowAreaComponentExtensions == null) {
+                    EmptyWindowAreaControllerImpl()
+                } else {
+                    WindowAreaControllerImpl(windowAreaComponentExtensions)
+                }
+            return decorator.decorate(controller)
+        }
+
+        @JvmStatic
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        fun overrideDecorator(overridingDecorator: WindowAreaControllerDecorator) {
+            decorator = overridingDecorator
+        }
+
+        @JvmStatic
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        fun reset() {
+            decorator = EmptyDecorator
+        }
+    }
+}
+
+/**
+ * Decorator that allows us to provide different functionality
+ * in our window-testing artifact.
+ */
+@ExperimentalWindowApi
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+interface WindowAreaControllerDecorator {
+    /**
+     * Returns an instance of [WindowAreaController] associated to the [Activity]
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun decorate(controller: WindowAreaController): WindowAreaController
+}
+
+@ExperimentalWindowApi
+private object EmptyDecorator : WindowAreaControllerDecorator {
+    override fun decorate(controller: WindowAreaController): WindowAreaController {
+        return controller
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaControllerImpl.kt b/window/window/src/main/java/androidx/window/area/WindowAreaControllerImpl.kt
new file mode 100644
index 0000000..af9a398
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaControllerImpl.kt
@@ -0,0 +1,117 @@
+/*
+ * 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.area
+
+import android.app.Activity
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.window.core.BuildConfig
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.core.VerificationMode
+import androidx.window.extensions.area.WindowAreaComponent
+import androidx.window.extensions.area.WindowAreaComponent.SESSION_STATE_ACTIVE
+import androidx.window.extensions.area.WindowAreaComponent.SESSION_STATE_INACTIVE
+import androidx.window.extensions.core.util.function.Consumer
+import java.util.concurrent.Executor
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+
+/**
+ * Implementation of WindowAreaController for devices
+ * that do implement the WindowAreaComponent on device.
+ *
+ * Requires [Build.VERSION_CODES.N] due to the use of [Consumer].
+ * Will not be created though on API levels lower than
+ * [Build.VERSION_CODES.S] as that's the min level of support for
+ * this functionality.
+ */
+@ExperimentalWindowApi
+@RequiresApi(Build.VERSION_CODES.N)
+internal class WindowAreaControllerImpl(
+    private val windowAreaComponent: WindowAreaComponent
+) : WindowAreaController {
+
+    private var currentStatus: WindowAreaStatus? = null
+
+    override fun rearDisplayStatus(): Flow<WindowAreaStatus> {
+        return callbackFlow {
+            val listener = Consumer<@WindowAreaComponent.WindowAreaStatus Int> { status ->
+                currentStatus = WindowAreaAdapter.translate(status)
+                channel.trySend(currentStatus ?: WindowAreaStatus.UNSUPPORTED)
+            }
+            windowAreaComponent.addRearDisplayStatusListener(listener)
+            awaitClose {
+                windowAreaComponent.removeRearDisplayStatusListener(listener)
+            }
+        }.distinctUntilChanged()
+    }
+
+    override fun rearDisplayMode(
+        activity: Activity,
+        executor: Executor,
+        windowAreaSessionCallback: WindowAreaSessionCallback
+    ) {
+        // If we already have a status value that is not [WindowAreaStatus.AVAILABLE]
+        // we should throw an exception quick to indicate they tried to enable
+        // RearDisplay mode when it was not available.
+        if (currentStatus != null && currentStatus != WindowAreaStatus.AVAILABLE) {
+            throw UnsupportedOperationException("Rear Display mode cannot be enabled currently")
+        }
+        val rearDisplaySessionConsumer =
+            RearDisplaySessionConsumer(executor, windowAreaSessionCallback, windowAreaComponent)
+        windowAreaComponent.startRearDisplaySession(activity, rearDisplaySessionConsumer)
+    }
+
+    internal class RearDisplaySessionConsumer(
+        private val executor: Executor,
+        private val appCallback: WindowAreaSessionCallback,
+        private val extensionsComponent: WindowAreaComponent
+    ) : Consumer<@WindowAreaComponent.WindowAreaSessionState Int> {
+
+        private var session: WindowAreaSession? = null
+
+        override fun accept(t: @WindowAreaComponent.WindowAreaSessionState Int) {
+            when (t) {
+                SESSION_STATE_ACTIVE -> onSessionStarted()
+                SESSION_STATE_INACTIVE -> onSessionFinished()
+                else -> {
+                    if (BuildConfig.verificationMode == VerificationMode.STRICT) {
+                        Log.d(TAG, "Received an unknown session status value: $t")
+                    }
+                    onSessionFinished()
+                }
+            }
+        }
+
+        private fun onSessionStarted() {
+            session = RearDisplaySessionImpl(extensionsComponent)
+            session?.let { executor.execute { appCallback.onSessionStarted(it) } }
+        }
+
+        private fun onSessionFinished() {
+            session = null
+            executor.execute { appCallback.onSessionEnded() }
+        }
+    }
+
+    internal companion object {
+        private val TAG = WindowAreaControllerImpl::class.simpleName
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt b/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt
new file mode 100644
index 0000000..e84cb4a
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaSession.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.area
+
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Session interface to represent a long-standing
+ * WindowArea mode or feature that provides a handle
+ * to close the session.
+ */
+@ExperimentalWindowApi
+public interface WindowAreaSession {
+    fun close()
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaSessionCallback.kt b/window/window/src/main/java/androidx/window/area/WindowAreaSessionCallback.kt
new file mode 100644
index 0000000..15ea453
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaSessionCallback.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.area
+
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Callback to update the client on the WindowArea Session being
+ * started and ended.
+ * TODO(b/207720511) Move to window-java module when Kotlin API Finalized
+ */
+@ExperimentalWindowApi
+interface WindowAreaSessionCallback {
+
+    fun onSessionStarted(session: WindowAreaSession)
+
+    fun onSessionEnded()
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/area/WindowAreaStatus.kt b/window/window/src/main/java/androidx/window/area/WindowAreaStatus.kt
new file mode 100644
index 0000000..5f8f668
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/area/WindowAreaStatus.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.area
+
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Represents a window area status.
+ */
+@ExperimentalWindowApi
+class WindowAreaStatus private constructor(private val mDescription: String) {
+
+    override fun toString(): String {
+        return mDescription
+    }
+
+    companion object {
+        /**
+         * Status representing that the WindowArea feature is not a supported
+         * feature on the device.
+         */
+        @JvmField
+        val UNSUPPORTED = WindowAreaStatus("UNSUPPORTED")
+
+        /**
+         * Status representing that the WindowArea feature is currently not available
+         * to be enabled. This could be due to another process has enabled it, or that the
+         * current device configuration doesn't allow it.
+         */
+        @JvmField
+        val UNAVAILABLE = WindowAreaStatus("UNAVAILABLE")
+
+        /**
+         * Status representing that the WindowArea feature is available to be enabled.
+         */
+        @JvmField
+        val AVAILABLE = WindowAreaStatus("AVAILABLE")
+    }
+}
\ 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/ActivityEmbeddingController.kt b/window/window/src/main/java/androidx/window/embedding/ActivityEmbeddingController.kt
index d37a4ff..7a9574d 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityEmbeddingController.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityEmbeddingController.kt
@@ -33,9 +33,8 @@
      * @param activity the [Activity] to check.
      */
     // TODO(b/204399167) Migrate to a Flow
-    fun isActivityEmbedded(activity: Activity): Boolean {
-        return embeddingBackend.isActivityEmbedded(activity)
-    }
+    fun isActivityEmbedded(activity: Activity): Boolean =
+        embeddingBackend.isActivityEmbedded(activity)
 
     companion object {
         @Volatile
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
index 836a897..b76a3c2 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
@@ -20,10 +20,11 @@
 import android.content.Intent
 import android.util.Log
 import androidx.window.core.ActivityComponentInfo
-import androidx.window.embedding.MatcherUtils.isActivityOrIntentMatching
+import androidx.window.embedding.MatcherUtils.isActivityMatching
 import androidx.window.embedding.MatcherUtils.isIntentMatching
 import androidx.window.embedding.MatcherUtils.sDebugMatchers
 import androidx.window.embedding.MatcherUtils.sMatchersTag
+import androidx.window.embedding.MatcherUtils.validateComponentName
 
 /**
  * Filter for [ActivityRule] and [SplitPlaceholderRule] that checks for component name match when
@@ -69,26 +70,7 @@
     )
 
     init {
-        val packageName = activityComponentInfo.packageName
-        val className = activityComponentInfo.className
-        require(
-            packageName.isNotEmpty()
-        ) { "Package name must not be empty" }
-        require(
-            className.isNotEmpty()
-        ) { "Activity class name must not be empty." }
-        require(
-            !(
-                packageName.contains("*") &&
-                    packageName.indexOf("*") != packageName.length - 1
-                )
-        ) { "Wildcard in package name is only allowed at the end." }
-        require(
-            !(
-                className.contains("*") &&
-                    className.indexOf("*") != className.length - 1
-                )
-        ) { "Wildcard in class name is only allowed at the end." }
+        validateComponentName(activityComponentInfo.packageName, activityComponentInfo.className)
     }
 
     /**
@@ -122,9 +104,8 @@
      * @param activity the [Activity] to test against.
      */
     fun matchesActivity(activity: Activity): Boolean {
-        val match =
-            isActivityOrIntentMatching(activity, activityComponentInfo) &&
-                (intentAction == null || intentAction == activity.intent?.action)
+        val match = isActivityMatching(activity, activityComponentInfo) &&
+            (intentAction == null || intentAction == activity.intent?.action)
         if (sDebugMatchers) {
             val matchString = if (match) "MATCH" else "NO MATCH"
             Log.w(
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt b/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
index fbaebcc..310a9fa 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.
@@ -32,7 +33,7 @@
      * activity that blocks all user interactions, such as a warning dialog.
      */
     val alwaysExpand: Boolean = false
-) : EmbeddingRule() {
+) : EmbeddingRule(tag) {
 
     /**
      * Builder for [ActivityRule].
@@ -40,20 +41,36 @@
      * @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
 
         /**
-         * 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.
+         * Sets 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.
+         *
+         * @param alwaysExpand whether the activity should always be expanded on launch.
          */
         @SuppressWarnings("MissingGetterMatchingBuilder")
         fun setAlwaysExpand(alwaysExpand: Boolean): Builder =
             apply { this.alwaysExpand = alwaysExpand }
 
-        fun build() = ActivityRule(filters, alwaysExpand)
+        /**
+         * Sets a unique string to identify this [ActivityRule], which defaults to `null`.
+         *
+         * @param tag unique string to identify this [ActivityRule].
+         */
+        fun setTag(tag: String): Builder =
+            apply { this.tag = tag }
+
+        /**
+         * Builds an `ActivityRule` instance.
+         *
+         * @return The new `ActivityRule` instance.
+         */
+        fun build() = ActivityRule(tag, filters, alwaysExpand)
     }
 
     /**
@@ -61,16 +78,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
 
@@ -78,8 +93,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 4d693c7..7666ad7 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
@@ -38,18 +38,19 @@
      * process(es), [activitiesInProcess] will return an empty list, but this method will return
      * `false`.
      */
-    val isEmpty: Boolean = false
+    val isEmpty: Boolean
 ) {
 
+    /**
+     * Whether this [ActivityStack] contains the [activity].
+     */
     operator fun contains(activity: Activity): Boolean {
         return activitiesInProcess.contains(activity)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as ActivityStack
+        if (other !is ActivityStack) return false
 
         if (activitiesInProcess != other.activitiesInProcess) return false
         if (isEmpty != other.isEmpty) return false
@@ -63,11 +64,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..da6a05b 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,25 @@
 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
+import kotlin.Pair
 
 /**
  * Adapter class that translates data classes between Extension and Jetpack interfaces.
@@ -38,153 +58,263 @@
 internal class EmbeddingAdapter(
     private val predicateAdapter: PredicateAdapter
 ) {
+    private val vendorApiLevel = ExtensionsUtil.safeVendorApiLevel
+    private val api1Impl = VendorApiLevel1Impl(predicateAdapter)
+    private val api2Impl = VendorApiLevel2Impl()
 
     fun translate(splitInfoList: List<OEMSplitInfo>): List<SplitInfo> {
-        return splitInfoList.map(::translate)
+        return splitInfoList.map(this::translate)
     }
 
     private fun translate(splitInfo: OEMSplitInfo): SplitInfo {
-        val primaryActivityStack = splitInfo.primaryActivityStack
-        val isPrimaryStackEmpty = try {
-            primaryActivityStack.isEmpty
-        } catch (e: NoSuchMethodError) {
-            // Users may use older library which #isEmpty hasn't existed. Provide a fallback value
-            // for this case to avoid crash.
-            false
+        return when (vendorApiLevel) {
+            WindowExtensions.VENDOR_API_LEVEL_1 -> api1Impl.translateCompat(splitInfo)
+            WindowExtensions.VENDOR_API_LEVEL_2 -> api2Impl.translateCompat(splitInfo)
+            else -> {
+                val primaryActivityStack = splitInfo.primaryActivityStack
+                val secondaryActivityStack = splitInfo.secondaryActivityStack
+                SplitInfo(
+                    ActivityStack(
+                        primaryActivityStack.activities,
+                        primaryActivityStack.isEmpty
+                    ),
+                    ActivityStack(
+                        secondaryActivityStack.activities,
+                        secondaryActivityStack.isEmpty
+                    ),
+                    translate(splitInfo.splitAttributes)
+                )
+            }
         }
-        val primaryFragment = ActivityStack(primaryActivityStack.activities, isPrimaryStackEmpty)
+    }
 
-        val secondaryActivityStack = splitInfo.secondaryActivityStack
-        val isSecondaryStackEmpty = try {
-            secondaryActivityStack.isEmpty
-        } catch (e: NoSuchMethodError) {
-            // Users may use older library which #isEmpty hasn't existed. Provide a fallback value
-            // for this case to avoid crash.
-            false
+    internal 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.BackgroundColor.buildFromValue(
+                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")
         }
-        val secondaryFragment = ActivityStack(
-            secondaryActivityStack.activities,
-            isSecondaryStackEmpty
+
+    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")
+            }
         )
-        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) }
+    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 translateActivityIntentPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
-        return predicateAdapter.buildPairPredicate(
-            Activity::class,
-            Intent::class
-        ) { first, second ->
-            splitPairFilters.any { filter -> filter.matchesActivityIntentPair(first, second) }
-        }
-    }
-
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateParentMetricsPredicate(context: Context, splitRule: SplitRule): Any {
-        return predicateAdapter.buildPredicate(WindowMetrics::class) { windowMetrics ->
-            splitRule.checkParentMetrics(context, windowMetrics)
-        }
-    }
-
-    @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 api1Impl.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
+    internal 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.value)
+            .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 api1Impl.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 api1Impl.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 +329,221 @@
             }
         }.toSet()
     }
+
+    private inner class VendorApiLevel2Impl {
+        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo {
+            val primaryActivityStack = splitInfo.primaryActivityStack
+            val primaryFragment = ActivityStack(
+                primaryActivityStack.activities,
+                primaryActivityStack.isEmpty
+            )
+
+            val secondaryActivityStack = splitInfo.secondaryActivityStack
+            val secondaryFragment = ActivityStack(
+                secondaryActivityStack.activities,
+                secondaryActivityStack.isEmpty
+            )
+            return SplitInfo(
+                primaryFragment,
+                secondaryFragment,
+                translate(splitInfo.splitAttributes)
+            )
+        }
+    }
+
+    /**
+     * 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)
+            }
+
+        // TODO(b/267391190): Remove the NoSuchMethodError in EmbeddingAdapter
+        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo {
+            val primaryActivityStack = splitInfo.primaryActivityStack
+            val isPrimaryStackEmpty = try {
+                primaryActivityStack.isEmpty
+            } catch (e: NoSuchMethodError) {
+                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
+                // value for this case to avoid crash.
+                false
+            }
+            val primaryFragment = ActivityStack(
+                primaryActivityStack.activities,
+                isPrimaryStackEmpty
+            )
+
+            val secondaryActivityStack = splitInfo.secondaryActivityStack
+            val isSecondaryStackEmpty = try {
+                secondaryActivityStack.isEmpty
+            } catch (e: NoSuchMethodError) {
+                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
+                // value for this case to avoid crash.
+                false
+            }
+            val secondaryFragment = ActivityStack(
+                secondaryActivityStack.activities,
+                isSecondaryStackEmpty
+            )
+
+            val splitAttributes = getSplitAttributesCompat(splitInfo)
+            return SplitInfo(
+                primaryFragment,
+                secondaryFragment,
+                splitAttributes
+            )
+        }
+    }
 }
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 609e357..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
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..dafb5b9 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,11 @@
 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.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 +41,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,13 +82,42 @@
         return embeddingExtension.isActivityEmbedded(activity)
     }
 
+    override fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    ) {
+        if (!isSplitAttributesCalculatorSupported()) {
+            throw UnsupportedOperationException("#setSplitAttributesCalculator is not supported " +
+                "on the device.")
+        }
+        embeddingExtension.setSplitAttributesCalculator(
+            adapter.translateSplitAttributesCalculator(calculator)
+        )
+    }
+
+    override fun clearSplitAttributesCalculator() {
+        if (!isSplitAttributesCalculatorSupported()) {
+            throw UnsupportedOperationException("#clearSplitAttributesCalculator is not " +
+                "supported on the device.")
+        }
+        embeddingExtension.clearSplitAttributesCalculator()
+    }
+
+    override fun isSplitAttributesCalculatorSupported(): Boolean =
+        ExtensionsUtil.safeVendorApiLevel >= VENDOR_API_LEVEL_2
+
     companion object {
         const val DEBUG = true
         private const val TAG = "EmbeddingCompat"
 
         fun isEmbeddingAvailable(): Boolean {
             return try {
-                WindowExtensionsProvider.getWindowExtensions().activityEmbeddingComponent != null
+                EmbeddingCompat::class.java.classLoader?.let { loader ->
+                    SafeActivityEmbeddingComponentProvider(
+                        loader,
+                        ConsumerAdapter(loader),
+                        WindowExtensionsProvider.getWindowExtensions(),
+                    ).activityEmbeddingComponent != null
+                } ?: false
             } catch (e: NoClassDefFoundError) {
                 if (DEBUG) {
                     Log.d(TAG, "Embedding extension version not found")
@@ -79,17 +133,23 @@
 
         fun embeddingComponent(): ActivityEmbeddingComponent {
             return if (isEmbeddingAvailable()) {
-                WindowExtensionsProvider.getWindowExtensions().activityEmbeddingComponent
-                    ?: Proxy.newProxyInstance(
-                        EmbeddingCompat::class.java.classLoader,
-                        arrayOf(ActivityEmbeddingComponent::class.java)
-                    ) { _, _, _ -> } as ActivityEmbeddingComponent
+                EmbeddingCompat::class.java.classLoader?.let { loader ->
+                    SafeActivityEmbeddingComponentProvider(
+                        loader,
+                        ConsumerAdapter(loader),
+                        WindowExtensionsProvider.getWindowExtensions(),
+                    ).activityEmbeddingComponent
+                } ?: emptyActivityEmbeddingProxy()
             } else {
-                Proxy.newProxyInstance(
-                    EmbeddingCompat::class.java.classLoader,
-                    arrayOf(ActivityEmbeddingComponent::class.java)
-                ) { _, _, _ -> } as ActivityEmbeddingComponent
+                emptyActivityEmbeddingProxy()
             }
         }
+
+        private fun emptyActivityEmbeddingProxy(): ActivityEmbeddingComponent {
+            return Proxy.newProxyInstance(
+                EmbeddingCompat::class.java.classLoader,
+                arrayOf(ActivityEmbeddingComponent::class.java)
+            ) { _, _, _ -> } as ActivityEmbeddingComponent
+        }
     }
 }
\ No newline at end of file
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..99287fd 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 [SplitAttributesCalculatorParams.splitRuleTag].
+     * 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..b9e2aa2 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,111 @@
         }
     }
 
-    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 +304,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/MatcherUtils.kt b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
index eb61516..1095444 100644
--- a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
+++ b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
@@ -16,7 +16,6 @@
 package androidx.window.embedding
 
 import android.app.Activity
-import android.content.ComponentName
 import android.content.Intent
 import android.util.Log
 import androidx.window.core.ActivityComponentInfo
@@ -27,18 +26,6 @@
 internal object MatcherUtils {
     /** Checks component match allowing wildcard patterns. */
     internal fun areComponentsMatching(
-        activityComponent: ComponentName?,
-        ruleComponent: ComponentName
-    ): Boolean {
-        val activityActivityComponentInfo = activityComponent?.let(::ActivityComponentInfo)
-        return areComponentsMatching(
-            activityActivityComponentInfo,
-            ActivityComponentInfo(ruleComponent)
-        )
-    }
-
-    /** Checks component match allowing wildcard patterns. */
-    internal fun areComponentsMatching(
         activityComponent: ActivityComponentInfo?,
         ruleComponent: ActivityComponentInfo
     ): Boolean {
@@ -69,7 +56,7 @@
      * Returns `true` if [Activity.getComponentName] match or [Activity.getIntent] match allowing
      * wildcard patterns.
      */
-    internal fun isActivityOrIntentMatching(
+    internal fun isActivityMatching(
         activity: Activity,
         ruleComponent: ActivityComponentInfo
     ): Boolean {
@@ -86,20 +73,24 @@
      */
     internal fun isIntentMatching(
         intent: Intent,
-        ruleActivityComponentInfo: ActivityComponentInfo
+        ruleComponent: ActivityComponentInfo
     ): Boolean {
-        if (intent.component != null) {
-            // Compare the component if set.
-            return areComponentsMatching(
+        // Check if the component is matched.
+        if (areComponentsMatching(
                 intent.component?.let(::ActivityComponentInfo),
-                ruleActivityComponentInfo
-            )
+                ruleComponent
+            )) {
+            return true
+        }
+        if (intent.component != null) {
+            // Only check package if the component is not set.
+            return false
         }
         // Check if there is wildcard match for Intent that only specifies the packageName.
         val packageName = intent.`package` ?: return false
-        return (packageName == ruleActivityComponentInfo.packageName ||
-            wildcardMatch(packageName, ruleActivityComponentInfo.packageName)) &&
-            ruleActivityComponentInfo.className == "*"
+        return (packageName == ruleComponent.packageName ||
+            wildcardMatch(packageName, ruleComponent.packageName)) &&
+            ruleComponent.className == "*"
     }
 
     /**
@@ -123,6 +114,22 @@
         return name.startsWith(pattern.substring(0, pattern.length - 1))
     }
 
+    /**
+     * Makes sure the component name is in the correct format.
+     */
+    internal fun validateComponentName(packageName: String, className: String) {
+        require(packageName.isNotEmpty()) { "Package name must not be empty" }
+        require(className.isNotEmpty()) { "Activity class name must not be empty" }
+        require(
+            !(packageName.contains("*") &&
+                packageName.indexOf("*") != packageName.length - 1)
+        ) { "Wildcard in package name is only allowed at the end." }
+        require(
+            !(className.contains("*") &&
+                className.indexOf("*") != className.length - 1)
+        ) { "Wildcard in class name is only allowed at the end." }
+    }
+
     internal const val sDebugMatchers = SplitController.sDebug
     internal const val sMatchersTag = "SplitRuleResolution"
 }
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..add2f25 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,197 @@
                     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,
+                SplitAttributes.BackgroundColor.DEFAULT.value
+            )
+            typedArray.recycle()
+
+            val defaultAttrs = SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.buildSplitTypeFromValue(ratio))
+                .setLayoutDirection(
+                    SplitAttributes.LayoutDirection.getLayoutDirectionFromValue(layoutDir)
+                )
+                .setAnimationBackgroundColor(
+                    SplitAttributes.BackgroundColor.buildFromValue(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,
+                SplitAttributes.BackgroundColor.DEFAULT.value
+            )
+            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(
+                    SplitAttributes.BackgroundColor.buildFromValue(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 +331,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/SafeActivityEmbeddingComponentProvider.kt b/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt
new file mode 100644
index 0000000..44699d8
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SafeActivityEmbeddingComponentProvider.kt
@@ -0,0 +1,205 @@
+/*
+ * 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.embedding
+
+import android.app.Activity
+import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
+import androidx.window.extensions.WindowExtensions
+import androidx.window.extensions.core.util.function.Consumer
+import androidx.window.extensions.core.util.function.Function
+import androidx.window.extensions.embedding.ActivityEmbeddingComponent
+import androidx.window.reflection.ReflectionUtils.doesReturn
+import androidx.window.reflection.ReflectionUtils.isPublic
+import androidx.window.reflection.ReflectionUtils.validateReflection
+import androidx.window.reflection.WindowExtensionsConstants.ACTIVITY_EMBEDDING_COMPONENT_CLASS
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_EXTENSIONS_CLASS
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_EXTENSIONS_PROVIDER_CLASS
+
+/**
+ * Reflection Guard for [ActivityEmbeddingComponent].
+ * This will go through the [ActivityEmbeddingComponent]'s method by reflection and
+ * check each method's name and signature to see if the interface is what we required.
+ */
+internal class SafeActivityEmbeddingComponentProvider(
+    private val loader: ClassLoader,
+    private val consumerAdapter: ConsumerAdapter,
+    private val windowExtensions: WindowExtensions
+) {
+    val activityEmbeddingComponent: ActivityEmbeddingComponent?
+        get() {
+            return if (canUseActivityEmbeddingComponent()) {
+                try {
+                    windowExtensions.activityEmbeddingComponent
+                } catch (e: UnsupportedOperationException) {
+                    null
+                }
+            } else {
+                null
+            }
+        }
+
+    private fun canUseActivityEmbeddingComponent(): Boolean {
+        if (!isWindowExtensionsValid() || !isActivityEmbeddingComponentValid()) {
+            return false
+        }
+        // TODO(b/267573854) : update logic to fallback to lower version
+        //  if higher version is not matched
+        return when (ExtensionsUtil.safeVendorApiLevel) {
+            1 -> hasValidVendorApiLevel1()
+            in 2..Int.MAX_VALUE -> hasValidVendorApiLevel2()
+            // TODO(b/267956499) : add  hasValidVendorApiLevel3
+            else -> false
+        }
+    }
+
+    /**
+     * [WindowExtensions.VENDOR_API_LEVEL_1] includes the following methods:
+     *  - [ActivityEmbeddingComponent.setEmbeddingRules]
+     *  - [ActivityEmbeddingComponent.isActivityEmbedded]
+     *  - [ActivityEmbeddingComponent.setSplitInfoCallback] with [java.util.function.Consumer]
+     * and following classes: TODO(b/268583307) : add guard function for those classes
+     *  - [androidx.window.extensions.embedding.ActivityRule]
+     *  - [androidx.window.extensions.embedding.SplitPairRule]
+     *  - [androidx.window.extensions.embedding.SplitPlaceholderRule]
+     *  - [androidx.window.extensions.embedding.SplitInfo]
+     */
+    private fun hasValidVendorApiLevel1(): Boolean {
+        return isMethodSetEmbeddingRulesValid() &&
+            isMethodIsActivityEmbeddedValid() &&
+            isMethodSetSplitInfoCallbackJavaConsumerValid()
+    }
+
+    /**
+     * [WindowExtensions.VENDOR_API_LEVEL_2] includes the following methods
+     *  - [ActivityEmbeddingComponent.setSplitInfoCallback] with [Consumer]
+     *  - [ActivityEmbeddingComponent.clearSplitInfoCallback]
+     *  - [ActivityEmbeddingComponent.setSplitAttributesCalculator]
+     *  - [ActivityEmbeddingComponent.clearSplitAttributesCalculator]
+     * and following classes: TODO(b/268583307) : add guard function for those classes
+     *  - [androidx.window.extensions.embedding.SplitAttributes]
+     */
+    private fun hasValidVendorApiLevel2(): Boolean {
+        return hasValidVendorApiLevel1() &&
+            isMethodSetSplitInfoCallbackWindowConsumerValid() &&
+            isMethodClearSplitInfoCallbackValid() &&
+            isMethodSplitAttributesCalculatorValid()
+    }
+
+    private fun isMethodSetEmbeddingRulesValid(): Boolean {
+        return validateReflection("ActivityEmbeddingComponent#setEmbeddingRules is not valid") {
+            val setEmbeddingRulesMethod = activityEmbeddingComponentClass.getMethod(
+                "setEmbeddingRules",
+                Set::class.java
+            )
+            setEmbeddingRulesMethod.isPublic
+        }
+    }
+
+    private fun isMethodIsActivityEmbeddedValid(): Boolean {
+        return validateReflection("ActivityEmbeddingComponent#isActivityEmbedded is not valid") {
+            val isActivityEmbeddedMethod = activityEmbeddingComponentClass.getMethod(
+                "isActivityEmbedded",
+                Activity::class.java
+            )
+            isActivityEmbeddedMethod.isPublic &&
+                isActivityEmbeddedMethod.doesReturn(Boolean::class.java)
+        }
+    }
+
+    private fun isMethodClearSplitInfoCallbackValid(): Boolean {
+        return validateReflection(
+            "ActivityEmbeddingComponent#clearSplitInfoCallback is not valid"
+        ) {
+            val clearSplitInfoCallbackMethod =
+                activityEmbeddingComponentClass.getMethod("clearSplitInfoCallback")
+            clearSplitInfoCallbackMethod.isPublic
+        }
+    }
+
+    private fun isMethodSplitAttributesCalculatorValid(): Boolean {
+        return validateReflection(
+            "ActivityEmbeddingComponent#setSplitAttributesCalculator is not valid"
+        ) {
+            val setSplitAttributesCalculatorMethod = activityEmbeddingComponentClass.getMethod(
+                "setSplitAttributesCalculator",
+                Function::class.java
+            )
+            val clearSplitAttributesCalculatorMethod =
+                activityEmbeddingComponentClass.getMethod("clearSplitAttributesCalculator")
+            setSplitAttributesCalculatorMethod.isPublic &&
+                clearSplitAttributesCalculatorMethod.isPublic
+        }
+    }
+
+    private fun isMethodSetSplitInfoCallbackJavaConsumerValid(): Boolean {
+        return validateReflection("ActivityEmbeddingComponent#setSplitInfoCallback is not valid") {
+            val consumerClass =
+                consumerAdapter.consumerClassOrNull() ?: return@validateReflection false
+            val setSplitInfoCallbackMethod =
+                activityEmbeddingComponentClass.getMethod("setSplitInfoCallback", consumerClass)
+            setSplitInfoCallbackMethod.isPublic
+        }
+    }
+
+    private fun isMethodSetSplitInfoCallbackWindowConsumerValid(): Boolean {
+        return validateReflection("ActivityEmbeddingComponent#setSplitInfoCallback is not valid") {
+            val setSplitInfoCallbackMethod = activityEmbeddingComponentClass.getMethod(
+                "setSplitInfoCallback",
+                Consumer::class.java
+            )
+            setSplitInfoCallbackMethod.isPublic
+        }
+    }
+
+    private fun isWindowExtensionsValid(): Boolean {
+        return validateReflection("WindowExtensionsProvider#getWindowExtensions is not valid") {
+            val providerClass = windowExtensionsProviderClass
+            val getWindowExtensionsMethod = providerClass.getDeclaredMethod("getWindowExtensions")
+            val windowExtensionsClass = windowExtensionsClass
+            getWindowExtensionsMethod.isPublic && getWindowExtensionsMethod.doesReturn(
+                windowExtensionsClass
+            )
+        }
+    }
+
+    private fun isActivityEmbeddingComponentValid(): Boolean {
+        return validateReflection("WindowExtensions#getActivityEmbeddingComponent is not valid") {
+            val extensionsClass = windowExtensionsClass
+            val getActivityEmbeddingComponentMethod =
+                extensionsClass.getMethod("getActivityEmbeddingComponent")
+            val activityEmbeddingComponentClass = activityEmbeddingComponentClass
+            getActivityEmbeddingComponentMethod.isPublic &&
+                getActivityEmbeddingComponentMethod.doesReturn(activityEmbeddingComponentClass)
+        }
+    }
+
+    private val windowExtensionsProviderClass: Class<*>
+        get() {
+            return loader.loadClass(WINDOW_EXTENSIONS_PROVIDER_CLASS)
+        }
+
+    private val windowExtensionsClass: Class<*>
+        get() {
+            return loader.loadClass(WINDOW_EXTENSIONS_CLASS)
+        }
+
+    private val activityEmbeddingComponentClass: Class<*>
+        get() {
+            return loader.loadClass(ACTIVITY_EMBEDDING_COMPONENT_CLASS)
+        }
+}
\ No newline at end of file
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..64219d2
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
@@ -0,0 +1,620 @@
+/*
+ * 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 android.graphics.Color
+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.BackgroundColor
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+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
+ *     [BackgroundColor], 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
+ * @see SplitAttributes.BackgroundColor
+ */
+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 color 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 to use the current theme window background color.
+     *
+     * @see BackgroundColor.color
+     * @see BackgroundColor.DEFAULT
+     */
+    val animationBackgroundColor: BackgroundColor = BackgroundColor.DEFAULT
+) {
+
+    /**
+     * 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")
+            }
+        }
+    }
+
+    /**
+     * Background color to be used for window transition animations in a split if the animation
+     * requires a background.
+     *
+     * @see SplitAttributes.animationBackgroundColor
+     */
+    class BackgroundColor private constructor(
+
+        /**
+         * The description of this `BackgroundColor`.
+         */
+        private val description: String,
+
+        /**
+         * [ColorInt] to represent the color to use as the background color.
+         */
+        @ColorInt
+        internal val value: Int,
+    ) {
+        override fun toString() = "BackgroundColor($description)"
+
+        override fun equals(other: Any?): Boolean {
+            if (other === this) return true
+            if (other !is BackgroundColor) return false
+            return value == other.value && description == other.description
+        }
+
+        override fun hashCode() = description.hashCode() + 31 * value.hashCode()
+
+        /**
+         * Methods that create various [BackgroundColor].
+         */
+        companion object {
+
+            /**
+             * Creates a [BackgroundColor] to represent the given [color].
+             *
+             * Only opaque color is supported.
+             *
+             * @param color [ColorInt] of an opaque color.
+             * @return the [BackgroundColor] representing the [color].
+             *
+             * @see [DEFAULT] for the default value, which means to use the
+             * current theme window background color.
+             */
+            @JvmStatic
+            fun color(
+                @IntRange(from = Color.BLACK.toLong(), to = Color.WHITE.toLong())
+                @ColorInt
+                color: Int
+            ):
+                BackgroundColor {
+                require(Color.BLACK <= color && color <= Color.WHITE) {
+                    "Background color must be opaque"
+                }
+                return BackgroundColor("color:${Integer.toHexString(color)}", color)
+            }
+
+            /**
+             * The special [BackgroundColor] to represent the default value,
+             * which means to use the current theme window background color.
+             */
+            @JvmField
+            val DEFAULT = BackgroundColor("DEFAULT", 0)
+
+            /**
+             * Returns a [BackgroundColor] with the given [value]
+             */
+            internal fun buildFromValue(@ColorInt value: Int): BackgroundColor {
+                return if (Color.alpha(value) != 255) {
+                    // Treat any non-opaque color as the default.
+                    DEFAULT
+                } else {
+                    color(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=$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 to use the current theme
+     *    window background color.
+     */
+    class Builder {
+        private var splitType: SplitType = splitEqually()
+        private var layoutDirection = LOCALE
+        private var animationBackgroundColor = BackgroundColor.DEFAULT
+
+        /**
+         * 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 color to use for the background color during animation
+         * of the split involving this `SplitAttributes` object if the animation
+         * requires a background. Only opaque color is supported.
+         *
+         * The default is [BackgroundColor.DEFAULT], which means to use the
+         * current theme window background color.
+         *
+         * @param color The animation background color.
+         * @return This `Builder`.
+         *
+         * @see BackgroundColor.color
+         * @see BackgroundColor.DEFAULT
+         */
+        fun setAnimationBackgroundColor(color: BackgroundColor): Builder =
+            apply {
+                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..b3dc89c 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
@@ -28,11 +28,13 @@
      * 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
 ) {
+    /**
+     * Whether the [primaryActivityStack] or the [secondaryActivityStack] in this [SplitInfo]
+     * contains the [activity].
+     */
     operator fun contains(activity: Activity): Boolean {
         return primaryActivityStack.contains(activity) ||
             secondaryActivityStack.contains(activity)
@@ -44,7 +46,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,16 +54,17 @@
     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
     }
 
     override fun toString(): String {
         return buildString {
             append("SplitInfo:{")
-            append("primaryActivityStack=$primaryActivityStack,")
-            append("secondaryActivityStack=$secondaryActivityStack,")
-            append("splitRatio=$splitRatio}")
+            append("primaryActivityStack=$primaryActivityStack, ")
+            append("secondaryActivityStack=$secondaryActivityStack, ")
+            append("splitAttributes=$splitAttributes, ")
+            append("}")
         }
     }
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
index d09fa3b..5c022fa 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
@@ -20,10 +20,11 @@
 import android.content.Intent
 import android.util.Log
 import androidx.window.core.ActivityComponentInfo
-import androidx.window.embedding.MatcherUtils.areComponentsMatching
+import androidx.window.embedding.MatcherUtils.isActivityMatching
 import androidx.window.embedding.MatcherUtils.isIntentMatching
 import androidx.window.embedding.MatcherUtils.sDebugMatchers
 import androidx.window.embedding.MatcherUtils.sMatchersTag
+import androidx.window.embedding.MatcherUtils.validateComponentName
 
 /**
  * Filter for [SplitPairRule] and used to find if a pair of activities should be put in a split.
@@ -79,6 +80,14 @@
     val secondaryActivityIntentAction: String?
 ) {
 
+    init {
+        validateComponentName(primaryActivityName.packageName, primaryActivityName.className)
+        validateComponentName(secondaryActivityName.packageName, secondaryActivityName.className)
+    }
+
+    private val primaryActivityInfo: ActivityComponentInfo
+        get() = ActivityComponentInfo(primaryActivityName)
+
     private val secondaryActivityInfo: ActivityComponentInfo
         get() = ActivityComponentInfo(secondaryActivityName)
 
@@ -92,11 +101,13 @@
      */
     fun matchesActivityPair(primaryActivity: Activity, secondaryActivity: Activity): Boolean {
         // Check if the activity component names match
-        var match = areComponentsMatching(primaryActivity.componentName, primaryActivityName) &&
-            areComponentsMatching(secondaryActivity.componentName, secondaryActivityName)
-        // If the intent is not empty - check that the rest of the filter fields match
-        if (secondaryActivity.intent != null) {
-            match = match && matchesActivityIntentPair(primaryActivity, secondaryActivity.intent)
+        val match = if (!isActivityMatching(primaryActivity, primaryActivityInfo)) {
+            false
+        } else if (!isActivityMatching(secondaryActivity, secondaryActivityInfo)) {
+            false
+        } else {
+            secondaryActivityIntentAction == null ||
+                secondaryActivityIntentAction == secondaryActivity.intent?.action
         }
 
         if (sDebugMatchers) {
@@ -123,14 +134,9 @@
         primaryActivity: Activity,
         secondaryActivityIntent: Intent
     ): Boolean {
-        val inPrimaryActivityName = primaryActivity.componentName
-        val match = if (
-            !areComponentsMatching(inPrimaryActivityName, primaryActivityName)
-        ) {
+        val match = if (!isActivityMatching(primaryActivity, primaryActivityInfo)) {
             false
-        } else if (
-            !isIntentMatching(secondaryActivityIntent, secondaryActivityInfo)
-        ) {
+        } else if (!isIntentMatching(secondaryActivityIntent, secondaryActivityInfo)) {
             false
         } else {
             secondaryActivityIntentAction == null ||
@@ -147,43 +153,6 @@
         return match
     }
 
-    init {
-        val primaryPackageName = primaryActivityName.packageName
-        val primaryClassName = primaryActivityName.className
-        val secondaryPackageName = secondaryActivityName.packageName
-        val secondaryClassName = secondaryActivityName.className
-        require(
-            !(primaryPackageName.isEmpty() || secondaryPackageName.isEmpty())
-        ) { "Package name must not be empty" }
-        require(
-            !(primaryClassName.isEmpty() || secondaryClassName.isEmpty())
-        ) { "Activity class name must not be empty." }
-        require(
-            !(
-                primaryPackageName.contains("*") &&
-                    primaryPackageName.indexOf("*") != primaryPackageName.length - 1
-                )
-        ) { "Wildcard in package name is only allowed at the end." }
-        require(
-            !(
-                primaryClassName.contains("*") &&
-                    primaryClassName.indexOf("*") != primaryClassName.length - 1
-                )
-        ) { "Wildcard in class name is only allowed at the end." }
-        require(
-            !(
-                secondaryPackageName.contains("*") &&
-                    secondaryPackageName.indexOf("*") != secondaryPackageName.length - 1
-                )
-        ) { "Wildcard in package name is only allowed at the end." }
-        require(
-            !(
-                secondaryClassName.contains("*") &&
-                    secondaryClassName.indexOf("*") != secondaryClassName.length - 1
-                )
-        ) { "Wildcard in class name is only allowed at the end." }
-    }
-
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is SplitPairFilter) return false
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 c4311b3..2cf3650 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
@@ -16,20 +16,18 @@
 
 package androidx.window.embedding
 
-import android.util.LayoutDirection.LOCALE
-import android.util.LayoutDirection.LTR
-import android.util.LayoutDirection.RTL
-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 {
@@ -44,23 +42,21 @@
      * Determines what happens with the primary container when all activities are finished in the
      * associated secondary container.
      *
-     * @see SplitRule.FINISH_NEVER
-     * @see SplitRule.FINISH_ALWAYS
-     * @see SplitRule.FINISH_ADJACENT
+     * @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.FINISH_NEVER
-     * @see SplitRule.FINISH_ALWAYS
-     * @see SplitRule.FINISH_ADJACENT
+     * @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
@@ -70,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
@@ -95,23 +92,21 @@
      * 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()
 
         /**
          * Sets the smallest value of width of the parent window when the split should be used, in
@@ -122,18 +117,45 @@
          *
          * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
          * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+         *
+         * @param minWidthDp the smallest value of width of the parent window when the split should
+         * be used, in DP.
          */
         fun setMinWidthDp(@IntRange(from = 0) minWidthDp: Int): Builder =
             apply { this.minWidthDp = minWidthDp }
 
         /**
+         * 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.
+         *
+         * @param minHeightDp the smallest value of height of the parent task window when the split
+         * should be used, in DP.
+         *
+         * @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
+         * 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.
+         *
+         * @param minSmallestWidthDp the smallest value of the smallest possible width of the parent
+         * window in any rotation when the split should be used, in DP.
          */
         fun setMinSmallestWidthDp(@IntRange(from = 0) minSmallestWidthDp: Int): Builder =
             apply { this.minSmallestWidthDp = minSmallestWidthDp }
@@ -150,6 +172,9 @@
          * the recommend value to only allow split when the parent window is not too stretched in
          * portrait.
          *
+         * @param aspectRatio 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.
+         *
          * @see EmbeddingAspectRatio.ratio
          * @see EmbeddingAspectRatio.ALWAYS_ALLOW
          * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
@@ -168,6 +193,9 @@
          * 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.
          *
+         * @param aspectRatio 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.
+         *
          * @see EmbeddingAspectRatio.ratio
          * @see EmbeddingAspectRatio.ALWAYS_ALLOW
          * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
@@ -179,12 +207,15 @@
          * Sets the behavior of the primary container when all activities are finished in the
          * associated secondary container.
          *
-         * @see SplitRule.FINISH_NEVER
-         * @see SplitRule.FINISH_ALWAYS
-         * @see SplitRule.FINISH_ADJACENT
+         * @param finishPrimaryWithSecondary the [SplitRule.FinishBehavior] 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 }
 
@@ -192,12 +223,15 @@
          * Sets the behavior of the secondary container when all activities are finished in the
          * associated primary container.
          *
-         * @see SplitRule.FINISH_NEVER
-         * @see SplitRule.FINISH_ALWAYS
-         * @see SplitRule.FINISH_ADJACENT
+         * @param finishSecondaryWithPrimary the [SplitRule.FinishBehavior] 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 }
 
@@ -205,35 +239,53 @@
          * 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.
+         *
+         * @param clearTop whether the existing secondary container on top and all activities in it
+         * should be destroyed when a new split is created using this rule.
          */
         @SuppressWarnings("MissingGetterMatchingBuilder")
         fun setClearTop(clearTop: Boolean): Builder =
             apply { this.clearTop = clearTop }
 
         /**
-         * Sets what part of the width should be given to the primary activity.
+         * Sets the default [SplitAttributes] to apply on the activity containers pair when the host
+         * task bounds satisfy [minWidthDp], [minHeightDp], [minSmallestWidthDp],
+         * [maxAspectRatioInPortrait] and [maxAspectRatioInLandscape] requirements.
          *
-         * The default is `0.5` if the app doesn't set, which is to split with equal width.
+         * @param defaultSplitAttributes the default [SplitAttributes] to apply on the activity
+         * containers pair when the host task bounds satisfy all the rule 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 }
 
         /**
-         * Sets 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].
+         * 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].
+         *
+         * @param tag unique string to identify this [SplitPairRule].
          */
-        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)
+        /**
+         * Builds a `SplitPairRule` instance.
+         *
+         * @return The new `SplitPairRule` instance.
+         */
+        fun build() = SplitPairRule(
+            tag,
+            filters,
+            finishPrimaryWithSecondary,
+            finishSecondaryWithPrimary,
+            clearTop,
+            minWidthDp,
+            minHeightDp,
+            minSmallestWidthDp,
+            maxAspectRatioInPortrait,
+            maxAspectRatioInLandscape,
+            defaultSplitAttributes,
+        )
     }
 
     /**
@@ -245,15 +297,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()
     }
 
@@ -281,9 +334,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 d693d22..2639171 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
@@ -17,17 +17,14 @@
 package androidx.window.embedding
 
 import android.content.Intent
-import android.util.LayoutDirection.LOCALE
-import android.util.LayoutDirection.LTR
-import android.util.LayoutDirection.RTL
-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
 
 /**
  * Configuration rules for split placeholders.
@@ -65,39 +62,32 @@
     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 SplitRule.FINISH_ALWAYS
-     * @see SplitRule.FINISH_ADJACENT
+     * **Note** that it is not valid to set [SplitRule.FinishBehavior.NEVER]
+     *
+     * @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
@@ -114,21 +104,20 @@
      */
     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()
 
         /**
          * Sets the smallest value of width of the parent window when the split should be used, in
@@ -139,18 +128,45 @@
          *
          * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
          * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+         *
+         * @param minWidthDp the smallest value of width of the parent window when the split should
+         * be used, in DP.
          */
         fun setMinWidthDp(@IntRange(from = 0) minWidthDp: Int): Builder =
             apply { this.minWidthDp = minWidthDp }
 
         /**
+         * 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.
+         *
+         * @param minHeightDp the smallest value of height of the parent task window when the split
+         * should be used, in DP.
+         *
+         * @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
+         * 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.
+         *
+         * @param minSmallestWidthDp the smallest value of the smallest possible width of the parent
+         * window in any rotation when the split should be used, in DP.
          */
         fun setMinSmallestWidthDp(@IntRange(from = 0) minSmallestWidthDp: Int): Builder =
             apply { this.minSmallestWidthDp = minSmallestWidthDp }
@@ -167,6 +183,9 @@
          * the recommend value to only allow split when the parent window is not too stretched in
          * portrait.
          *
+         * @param aspectRatio 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.
+         *
          * @see EmbeddingAspectRatio.ratio
          * @see EmbeddingAspectRatio.ALWAYS_ALLOW
          * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
@@ -185,6 +204,9 @@
          * 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.
          *
+         * @param aspectRatio 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.
+         *
          * @see EmbeddingAspectRatio.ratio
          * @see EmbeddingAspectRatio.ALWAYS_ALLOW
          * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
@@ -196,12 +218,15 @@
          * Sets the behavior of the primary container when all activities are finished in the
          * associated placeholder container.
          *
-         * @see SplitRule.FINISH_ALWAYS
-         * @see SplitRule.FINISH_ADJACENT
+         * **Note** that it is not valid to set [SplitRule.FinishBehavior.NEVER]
+         *
+         * @param finishPrimaryWithPlaceholder the [SplitRule.FinishBehavior] 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
             }
@@ -209,34 +234,52 @@
         /**
          * Sets whether the placeholder will show on top in a smaller window size after it first
          * appeared in a split with sufficient minimum width.
+         *
+         * @param isSticky 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 }
 
         /**
-         * Sets what part of the width should be given to the primary activity.
+         * Sets the default [SplitAttributes] to apply on the activity containers pair when the host
+         * task bounds satisfy [minWidthDp], [minHeightDp], [minSmallestWidthDp],
+         * [maxAspectRatioInPortrait] and [maxAspectRatioInLandscape] requirements.
          *
-         * The default is `0.5` if the app doesn't set, which is to split with equal width.
+         * @param defaultSplitAttributes the default [SplitAttributes] to apply on the activity
+         * containers pair when the host task bounds satisfy all the rule 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 }
 
         /**
-         * Sets 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].
+         * Sets a unique string to identify this [SplitPlaceholderRule], which defaults to `null`.
+         * The suggested usage is to set the tag to be able to differentiate between different rules
+         * in the [SplitAttributesCalculatorParams.splitRuleTag].
+         *
+         * @param tag unique string to identify this [SplitPlaceholderRule].
          */
-        fun setLayoutDirection(@LayoutDirection layoutDirection: Int): Builder =
-            apply { this.layoutDirection = layoutDirection }
+        fun setTag(tag: String?): Builder =
+            apply { this.tag = tag }
 
-        fun build() = SplitPlaceholderRule(filters, placeholderIntent, isSticky,
-            finishPrimaryWithPlaceholder, minWidthDp, minSmallestWidthDp, maxAspectRatioInPortrait,
-            maxAspectRatioInLandscape, splitRatio, layoutDirection)
+        /**
+         * Builds a `SplitPlaceholderRule` instance.
+         *
+         * @return The new `SplitPlaceholderRule` instance.
+         */
+        fun build() = SplitPlaceholderRule(
+            tag,
+            filters,
+            placeholderIntent,
+            isSticky,
+            finishPrimaryWithPlaceholder,
+            minWidthDp,
+            minHeightDp,
+            minSmallestWidthDp,
+            maxAspectRatioInPortrait,
+            maxAspectRatioInLandscape,
+            defaultSplitAttributes,
+        )
     }
 
     /**
@@ -248,14 +291,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()
     }
 
@@ -282,16 +326,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 d50a8aa..c989e32 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.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,12 +40,26 @@
  * 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.
      *
@@ -56,10 +70,25 @@
     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.
+     *
+     * @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.
      *
      * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
      * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
@@ -75,8 +104,8 @@
      *
      * 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.ALWAYS_ALLOW
@@ -92,8 +121,8 @@
      *
      * 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.ALWAYS_ALLOW
@@ -102,78 +131,24 @@
     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], [minSmallestWidthDp],
+     * [maxAspectRatioInPortrait] and [maxAspectRatioInLandscape] 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 +158,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
 
@@ -204,24 +177,68 @@
     }
 
     /**
-     * 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,9 +253,12 @@
             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) {
@@ -250,7 +270,7 @@
             maxAspectRatioInLandscape == ALWAYS_ALLOW ||
                 width * 1f / height <= maxAspectRatioInLandscape.value
         }
-        return validMinWidth && validSmallestMinWidth && validAspectRatio
+        return validMinWidth && validMinHeight && validSmallestMinWidth && validAspectRatio
     }
 
     /**
@@ -272,31 +292,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/SafeWindowLayoutComponentProvider.kt b/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
index 6c9ec9d..fdc25a2 100644
--- a/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
+++ b/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
@@ -17,14 +17,30 @@
 package androidx.window.layout
 
 import android.app.Activity
+import android.content.Context
 import android.graphics.Rect
 import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
+import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.WindowExtensionsProvider
+import androidx.window.extensions.core.util.function.Consumer
 import androidx.window.extensions.layout.WindowLayoutComponent
-import java.lang.reflect.Method
-import java.lang.reflect.Modifier
-import kotlin.reflect.KClass
+import androidx.window.reflection.ReflectionUtils.checkIsPresent
+import androidx.window.reflection.ReflectionUtils.doesReturn
+import androidx.window.reflection.ReflectionUtils.isPublic
+import androidx.window.reflection.ReflectionUtils.validateReflection
+import androidx.window.reflection.WindowExtensionsConstants.FOLDING_FEATURE_CLASS
+import androidx.window.reflection.WindowExtensionsConstants.JAVA_CONSUMER
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_CONSUMER
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_EXTENSIONS_CLASS
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_EXTENSIONS_PROVIDER_CLASS
+import androidx.window.reflection.WindowExtensionsConstants.WINDOW_LAYOUT_COMPONENT_CLASS
 
+/**
+ * Reflection Guard for [WindowLayoutComponent].
+ * This will go through the [WindowLayoutComponent]'s method by reflection and
+ * check each method's name and signature to see if the interface is what we required.
+ */
 internal class SafeWindowLayoutComponentProvider(
     private val loader: ClassLoader,
     private val consumerAdapter: ConsumerAdapter
@@ -44,14 +60,53 @@
         }
 
     private fun canUseWindowLayoutComponent(): Boolean {
-        return isWindowLayoutProviderValid() &&
-            isWindowExtensionsValid() &&
-            isWindowLayoutComponentValid() &&
-            isFoldingFeatureValid()
+        if (!isWindowExtensionsPresent() || !isWindowExtensionsValid() ||
+            !isWindowLayoutProviderValid() ||
+            !isFoldingFeatureValid()
+        ) {
+            return false
+        }
+        // TODO(b/267831038): can fallback to VendorApiLevel1 when level2 is not match
+        //  but level 1 is matched
+        return when (ExtensionsUtil.safeVendorApiLevel) {
+            1 -> hasValidVendorApiLevel1()
+            in 2..Int.MAX_VALUE -> hasValidVendorApiLevel2()
+            // TODO(b/267956499): add hasValidVendorApiLevel3
+            else -> false
+        }
     }
 
-    private fun isWindowLayoutProviderValid(): Boolean {
-        return validate {
+    private fun isWindowExtensionsPresent(): Boolean {
+        return checkIsPresent {
+            loader.loadClass(WINDOW_EXTENSIONS_PROVIDER_CLASS)
+        }
+    }
+
+    /**
+     * [WindowExtensions.VENDOR_API_LEVEL_1] includes the following methods
+     *  - [WindowLayoutComponent.addWindowLayoutInfoListener] with [Activity] and
+     * [java.util.function.Consumer]
+     *  - [WindowLayoutComponent.removeWindowLayoutInfoListener] with [java.util.function.Consumer]
+     */
+    private fun hasValidVendorApiLevel1(): Boolean {
+        return isMethodWindowLayoutInfoListenerJavaConsumerValid()
+    }
+
+    /**
+     * [WindowExtensions.VENDOR_API_LEVEL_2] includes the following methods
+     *  - [WindowLayoutComponent.addWindowLayoutInfoListener] with [Context] and
+     * [java.util.function.Consumer]
+     *  - [WindowLayoutComponent.addWindowLayoutInfoListener] with [Context] and [Consumer]
+     *  - [WindowLayoutComponent.removeWindowLayoutInfoListener] with [Consumer]
+     */
+    private fun hasValidVendorApiLevel2(): Boolean {
+        return hasValidVendorApiLevel1() &&
+            isMethodWindowLayoutInfoListenerJavaConsumerUiContextValid() &&
+            isMethodWindowLayoutInfoListenerWindowConsumerValid()
+    }
+
+    private fun isWindowExtensionsValid(): Boolean {
+        return validateReflection("WindowExtensionsProvider#getWindowExtensions is not valid") {
             val providerClass = windowExtensionsProviderClass
             val getWindowExtensionsMethod = providerClass.getDeclaredMethod("getWindowExtensions")
             val windowExtensionsClass = windowExtensionsClass
@@ -60,8 +115,8 @@
         }
     }
 
-    private fun isWindowExtensionsValid(): Boolean {
-        return validate {
+    private fun isWindowLayoutProviderValid(): Boolean {
+        return validateReflection("WindowExtensions#getWindowLayoutComponent is not valid") {
             val extensionsClass = windowExtensionsClass
             val getWindowLayoutComponentMethod =
                 extensionsClass.getMethod("getWindowLayoutComponent")
@@ -72,7 +127,7 @@
     }
 
     private fun isFoldingFeatureValid(): Boolean {
-        return validate {
+        return validateReflection("FoldingFeature class is not valid") {
             val foldingFeatureClass = foldingFeatureClass
             val getBoundsMethod = foldingFeatureClass.getMethod("getBounds")
             val getTypeMethod = foldingFeatureClass.getMethod("getType")
@@ -86,9 +141,13 @@
         }
     }
 
-    private fun isWindowLayoutComponentValid(): Boolean {
-        return validate {
-            val consumerClass = consumerAdapter.consumerClassOrNull() ?: return@validate false
+    private fun isMethodWindowLayoutInfoListenerJavaConsumerValid(): Boolean {
+        return validateReflection(
+            "WindowLayoutComponent#addWindowLayoutInfoListener(" +
+                "${Activity::class.java.name}, $JAVA_CONSUMER) is not valid"
+        ) {
+            val consumerClass =
+                consumerAdapter.consumerClassOrNull() ?: return@validateReflection false
             val windowLayoutComponent = windowLayoutComponentClass
             val addListenerMethod = windowLayoutComponent
                 .getMethod(
@@ -102,46 +161,59 @@
         }
     }
 
-    private fun validate(block: () -> Boolean): Boolean {
-        return try {
-            block()
-        } catch (noClass: ClassNotFoundException) {
-            false
-        } catch (noMethod: NoSuchMethodException) {
-            false
+    private fun isMethodWindowLayoutInfoListenerWindowConsumerValid(): Boolean {
+        return validateReflection(
+            "WindowLayoutComponent#addWindowLayoutInfoListener" +
+                "(${Context::class.java.name}, $WINDOW_CONSUMER) is not valid"
+        ) {
+            val windowLayoutComponent = windowLayoutComponentClass
+            val addListenerMethod = windowLayoutComponent
+                .getMethod(
+                    "addWindowLayoutInfoListener",
+                    Context::class.java,
+                    Consumer::class.java
+                )
+            val removeListenerMethod = windowLayoutComponent
+                .getMethod("removeWindowLayoutInfoListener", Consumer::class.java)
+            addListenerMethod.isPublic && removeListenerMethod.isPublic
         }
     }
 
-    private val Method.isPublic: Boolean
-        get() {
-            return Modifier.isPublic(modifiers)
+    private fun isMethodWindowLayoutInfoListenerJavaConsumerUiContextValid(): Boolean {
+        return validateReflection(
+            "WindowLayoutComponent#addWindowLayoutInfoListener" +
+                "(${Context::class.java.name}, $JAVA_CONSUMER) is not valid"
+        ) {
+            val consumerClass =
+                consumerAdapter.consumerClassOrNull() ?: return@validateReflection false
+            val windowLayoutComponent = windowLayoutComponentClass
+            val addListenerMethod = windowLayoutComponent
+                .getMethod(
+                    "addWindowLayoutInfoListener",
+                    Context::class.java,
+                    consumerClass
+                )
+            addListenerMethod.isPublic
         }
-
-    private fun Method.doesReturn(clazz: KClass<*>): Boolean {
-        return doesReturn(clazz.java)
-    }
-
-    private fun Method.doesReturn(clazz: Class<*>): Boolean {
-        return returnType.equals(clazz)
     }
 
     private val windowExtensionsProviderClass: Class<*>
         get() {
-            return loader.loadClass("androidx.window.extensions.WindowExtensionsProvider")
+            return loader.loadClass(WINDOW_EXTENSIONS_PROVIDER_CLASS)
         }
 
     private val windowExtensionsClass: Class<*>
         get() {
-            return loader.loadClass("androidx.window.extensions.WindowExtensions")
+            return loader.loadClass(WINDOW_EXTENSIONS_CLASS)
         }
 
     private val foldingFeatureClass: Class<*>
         get() {
-            return loader.loadClass("androidx.window.extensions.layout.FoldingFeature")
+            return loader.loadClass(FOLDING_FEATURE_CLASS)
         }
 
     private val windowLayoutComponentClass: Class<*>
         get() {
-            return loader.loadClass("androidx.window.extensions.layout.WindowLayoutComponent")
+            return loader.loadClass(WINDOW_LAYOUT_COMPONENT_CLASS)
         }
 }
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/java/androidx/window/reflection/ReflectionUtils.kt b/window/window/src/main/java/androidx/window/reflection/ReflectionUtils.kt
new file mode 100644
index 0000000..326486e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/reflection/ReflectionUtils.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.reflection
+
+import android.util.Log
+import java.lang.reflect.Method
+import java.lang.reflect.Modifier
+import kotlin.reflect.KClass
+
+/**
+ * Utility class used for reflection guard for WindowExtensions classes' validation
+ */
+internal object ReflectionUtils {
+
+    internal fun checkIsPresent(classLoader: () -> Class<*>): Boolean {
+        return try {
+            classLoader()
+            true
+        } catch (noClass: ClassNotFoundException) {
+            false
+        } catch (noDefinition: NoClassDefFoundError) {
+            false
+        }
+    }
+
+    /**
+     * Validates the code block normally for reflection. If there are [ClassNotFoundException]
+     * or [NoSuchMethodException] thrown, validation will fail.
+     * Otherwise will return the validation result from the [block]
+     */
+    @JvmStatic
+    internal fun validateReflection(errorMessage: String? = null, block: () -> Boolean): Boolean {
+        return try {
+            val result = block()
+            if (!result && errorMessage != null) {
+                Log.e("ReflectionGuard", errorMessage)
+            }
+            result
+        } catch (noClass: ClassNotFoundException) {
+            Log.e("ReflectionGuard", "ClassNotFound: ${errorMessage.orEmpty()}")
+            false
+        } catch (noMethod: NoSuchMethodException) {
+            Log.e("ReflectionGuard", "NoSuchMethod: ${errorMessage.orEmpty()}")
+            false
+        }
+    }
+
+    /**
+     * Checks if a method has public modifier
+     */
+    internal val Method.isPublic: Boolean
+        get() {
+            return Modifier.isPublic(modifiers)
+        }
+
+    /**
+     * Checks if a method's return value is type of kotlin [clazz]
+     */
+    internal fun Method.doesReturn(clazz: KClass<*>): Boolean {
+        return doesReturn(clazz.java)
+    }
+
+    /**
+     * Checks if a method's return value is type of java [clazz]
+     */
+    internal fun Method.doesReturn(clazz: Class<*>): Boolean {
+        return returnType.equals(clazz)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/reflection/WindowExtensionsConstants.kt b/window/window/src/main/java/androidx/window/reflection/WindowExtensionsConstants.kt
new file mode 100644
index 0000000..341e019
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/reflection/WindowExtensionsConstants.kt
@@ -0,0 +1,74 @@
+/*
+ * 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.reflection
+
+/**
+ * Constants for WindowExtensions
+ */
+internal object WindowExtensionsConstants {
+    /**
+     * Constant name for package [androidx.window.extensions]
+     */
+    private const val WINDOW_EXTENSIONS_PACKAGE_NAME = "androidx.window.extensions"
+
+    /**
+     * Constant name for class [androidx.window.extensions.WindowExtensionsProvider] used
+     * for reflection
+     */
+    internal const val WINDOW_EXTENSIONS_PROVIDER_CLASS =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.WindowExtensionsProvider"
+
+    /**
+     * Constant name for class [androidx.window.extensions.WindowExtensions] used for reflection
+     */
+    internal const val WINDOW_EXTENSIONS_CLASS =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.WindowExtensions"
+
+    /**
+     * Constant name for class [androidx.window.extensions.layout.FoldingFeature]
+     * used for reflection
+     */
+    internal const val FOLDING_FEATURE_CLASS =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.layout.FoldingFeature"
+
+    /**
+     * Constant name for class [androidx.window.extensions.layout.WindowLayoutComponent]
+     * used for reflection
+     */
+    internal const val WINDOW_LAYOUT_COMPONENT_CLASS =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.layout.WindowLayoutComponent"
+
+    /**
+     * Constant name for class [androidx.window.extensions.embedding.ActivityEmbeddingComponent]
+     * used for reflection
+     */
+    internal const val ACTIVITY_EMBEDDING_COMPONENT_CLASS =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.embedding.ActivityEmbeddingComponent"
+
+    /**
+     * Constant name for class [androidx.window.extensions.core.util.function]
+     * used for reflection
+     */
+    internal const val WINDOW_CONSUMER =
+        "$WINDOW_EXTENSIONS_PACKAGE_NAME.core.util.function.Consumer"
+
+    /**
+     * Constant name for class [java.util.function.Consumer]
+     * used for reflection
+     */
+    internal const val JAVA_CONSUMER = "java.util.function.Consumer"
+}
diff --git a/window/window/src/main/res/values/attrs.xml b/window/window/src/main/res/values/attrs.xml
index 96527f8..a2880ca 100644
--- a/window/window/src/main/res/values/attrs.xml
+++ b/window/window/src/main/res/values/attrs.xml
@@ -14,134 +14,222 @@
   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. Only opaque color is supported.
+         The default is to use the current theme's windowBackground. Any non-opaque color will be
+         treated the same as default. -->
+    <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/area/WindowAreaAdapterUnitTest.kt b/window/window/src/test/java/androidx/window/area/WindowAreaAdapterUnitTest.kt
new file mode 100644
index 0000000..89a9808
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/area/WindowAreaAdapterUnitTest.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.area
+
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.extensions.area.WindowAreaComponent
+import org.junit.Test
+
+/**
+ * Unit tests for [WindowAreaAdapter] that run on the JVM.
+ */
+@OptIn(ExperimentalWindowApi::class)
+class WindowAreaAdapterUnitTest {
+
+    @Test
+    fun testWindowAreaStatusTranslateValueAvailable() {
+        val expected = WindowAreaStatus.AVAILABLE
+        val translateValue = WindowAreaAdapter.translate(WindowAreaComponent.STATUS_AVAILABLE)
+        assert(expected == translateValue)
+    }
+
+    @Test
+    fun testWindowAreaStatusTranslateValueUnavailable() {
+        val expected = WindowAreaStatus.UNAVAILABLE
+        val translateValue = WindowAreaAdapter.translate(WindowAreaComponent.STATUS_UNAVAILABLE)
+        assert(expected == translateValue)
+    }
+
+    @Test
+    fun testWindowAreaStatusTranslateValueUnsupported() {
+        val expected = WindowAreaStatus.UNSUPPORTED
+        val translateValue = WindowAreaAdapter.translate(WindowAreaComponent.STATUS_UNSUPPORTED)
+        assert(expected == translateValue)
+    }
+}
\ 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/ActivityStackTest.kt b/window/window/src/test/java/androidx/window/embedding/ActivityStackTest.kt
index 1af074c..b13af0c 100644
--- a/window/window/src/test/java/androidx/window/embedding/ActivityStackTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/ActivityStackTest.kt
@@ -27,16 +27,16 @@
     @Test
     fun testContainsActivity() {
         val activity = mock<Activity>()
-        val stack = ActivityStack(listOf(activity))
+        val stack = ActivityStack(listOf(activity), isEmpty = false)
 
-        assertTrue(stack.contains(activity))
+        assertTrue(activity in stack)
     }
 
     @Test
     fun testEqualsImpliesHashCode() {
         val activity = mock<Activity>()
-        val first = ActivityStack(listOf(activity))
-        val second = ActivityStack(listOf(activity))
+        val first = ActivityStack(listOf(activity), isEmpty = false)
+        val second = ActivityStack(listOf(activity), isEmpty = false)
 
         assertEquals(first, second)
         assertEquals(first.hashCode(), second.hashCode())
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/SplitInfoTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
index 8f15b16..07c0855 100644
--- a/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
@@ -27,9 +27,10 @@
     @Test
     fun testSplitInfoContainsActivityFirstStack() {
         val activity = mock<Activity>()
-        val firstStack = ActivityStack(listOf(activity))
-        val secondStack = ActivityStack(emptyList())
-        val info = SplitInfo(firstStack, secondStack, 0.5f)
+        val firstStack = createTestActivityStack(listOf(activity))
+        val secondStack = createTestActivityStack(emptyList())
+        val attributes = SplitAttributes()
+        val info = SplitInfo(firstStack, secondStack, attributes)
 
         assertTrue(info.contains(activity))
     }
@@ -37,9 +38,10 @@
     @Test
     fun testSplitInfoContainsActivitySecondStack() {
         val activity = mock<Activity>()
-        val firstStack = ActivityStack(emptyList())
-        val secondStack = ActivityStack(listOf(activity))
-        val info = SplitInfo(firstStack, secondStack, 0.5f)
+        val firstStack = createTestActivityStack(emptyList())
+        val secondStack = createTestActivityStack(listOf(activity))
+        val attributes = SplitAttributes()
+        val info = SplitInfo(firstStack, secondStack, attributes)
 
         assertTrue(info.contains(activity))
     }
@@ -47,12 +49,18 @@
     @Test
     fun testEqualsImpliesHashCode() {
         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 firstStack = createTestActivityStack(emptyList())
+        val secondStack = createTestActivityStack(listOf(activity))
+        val attributes = SplitAttributes()
+        val firstInfo = SplitInfo(firstStack, secondStack, attributes)
+        val secondInfo = SplitInfo(firstStack, secondStack, attributes)
 
         assertEquals(firstInfo, secondInfo)
         assertEquals(firstInfo.hashCode(), secondInfo.hashCode())
     }
+
+    private fun createTestActivityStack(
+        activitiesInProcess: List<Activity>,
+        isEmpty: Boolean = false,
+    ): ActivityStack = ActivityStack(activitiesInProcess, isEmpty)
 }
\ No newline at end of file
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/test/java/androidx/window/reflection/ReflectionUtilsTest.kt b/window/window/src/test/java/androidx/window/reflection/ReflectionUtilsTest.kt
new file mode 100644
index 0000000..bdab6f7
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/reflection/ReflectionUtilsTest.kt
@@ -0,0 +1,88 @@
+/*
+ * 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.reflection
+
+import androidx.window.reflection.ReflectionUtils.doesReturn
+import androidx.window.reflection.ReflectionUtils.isPublic
+import androidx.window.reflection.ReflectionUtils.validateReflection
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+
+/**
+ * Unit test for reflection utilities
+ */
+class ReflectionUtilsTest {
+
+    private lateinit var classLoader: ClassLoader
+
+    @Before
+    fun setup() {
+        classLoader = this::class.java.classLoader!!
+    }
+
+    @Test
+    fun testValidateReflectionSuccess() {
+        val result = validateReflection {
+            true
+        }
+        assertTrue(result)
+    }
+
+    @Test
+    fun testValidateReflectionFail() {
+        val result = validateReflection {
+            classLoader.loadClass("SomeUnExistedClass.java")
+            true
+        }
+        assertFalse(result)
+    }
+
+    @Test
+    fun testMethodModifier() {
+        val result = validateReflection {
+            val testClass = this::class.java
+            val privateMethod = testClass.getDeclaredMethod("testMethod").isPublic
+            assertFalse(privateMethod)
+            val publicMethod = testClass.getDeclaredMethod("testMethodModifier").isPublic
+            assertTrue(publicMethod)
+            true
+        }
+        assertTrue(result)
+    }
+
+    @Test
+    fun testDoesReturn() {
+        val result = validateReflection {
+            val testClass = this::class.java
+            val privateMethod = testClass.getDeclaredMethod("testMethod")
+            assertTrue(privateMethod.doesReturn(Int::class.java))
+            assertTrue(privateMethod.doesReturn(Int::class))
+            assertFalse(privateMethod.doesReturn(Any::class.java))
+            assertFalse(privateMethod.doesReturn(Any::class))
+            true
+        }
+        assertTrue(result)
+    }
+
+    // method for testing
+    @Suppress("unused")
+    private fun testMethod(): Int {
+        return 0
+    }
+}
\ No newline at end of file
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-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-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/api/current.txt b/work/work-runtime/api/current.txt
index 17b34bc..6964c18 100644
--- a/work/work-runtime/api/current.txt
+++ b/work/work-runtime/api/current.txt
@@ -62,9 +62,6 @@
     property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
-  public final class ConfigurationKt {
-  }
-
   public final class Constraints {
     ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
@@ -110,9 +107,6 @@
     property public final android.net.Uri uri;
   }
 
-  public final class ConstraintsKt {
-  }
-
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
@@ -204,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();
diff --git a/work/work-runtime/api/public_plus_experimental_current.txt b/work/work-runtime/api/public_plus_experimental_current.txt
index 17b34bc..6964c18 100644
--- a/work/work-runtime/api/public_plus_experimental_current.txt
+++ b/work/work-runtime/api/public_plus_experimental_current.txt
@@ -62,9 +62,6 @@
     property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
-  public final class ConfigurationKt {
-  }
-
   public final class Constraints {
     ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
@@ -110,9 +107,6 @@
     property public final android.net.Uri uri;
   }
 
-  public final class ConstraintsKt {
-  }
-
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
@@ -204,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();
diff --git a/work/work-runtime/api/restricted_current.txt b/work/work-runtime/api/restricted_current.txt
index 17b34bc..6964c18 100644
--- a/work/work-runtime/api/restricted_current.txt
+++ b/work/work-runtime/api/restricted_current.txt
@@ -62,9 +62,6 @@
     property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
-  public final class ConfigurationKt {
-  }
-
   public final class Constraints {
     ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
@@ -110,9 +107,6 @@
     property public final android.net.Uri uri;
   }
 
-  public final class ConstraintsKt {
-  }
-
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
@@ -204,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();
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
index c6d67f2..df87e7e 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
@@ -85,6 +85,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -407,6 +408,7 @@
                 containsInAnyOrder(value1, value2));
     }
 
+    @Ignore // b/268530685
     @Test
     @SmallTest
     public void testDependencies_setsPeriodStartTimesForUnblockedWork() {
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
index 848dd44..dd435cc 100644
--- a/work/work-testing/src/androidTest/java/androidx/work/testing/TestSchedulerRealExecutorTest.kt
+++ b/work/work-testing/src/androidTest/java/androidx/work/testing/TestSchedulerRealExecutorTest.kt
@@ -29,8 +29,10 @@
 import androidx.work.OneTimeWorkRequestBuilder
 import androidx.work.PeriodicWorkRequestBuilder
 import androidx.work.WorkInfo
+import androidx.work.WorkInfo.State.ENQUEUED
 import androidx.work.impl.WorkManagerImpl
 import androidx.work.impl.model.WorkSpec
+import androidx.work.impl.utils.taskexecutor.SerialExecutor
 import androidx.work.testing.workers.CountingTestWorker
 import androidx.work.testing.workers.RetryWorker
 import androidx.work.testing.workers.TestWorker
@@ -81,13 +83,14 @@
         // 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}"))
+            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 isEnqueued = info.state == ENQUEUED
                 val counter = CountingTestWorker.COUNT.get()
                 if (isEnqueued && counter == maxCount) {
                     periodicLatch.countDown()
@@ -160,6 +163,30 @@
     }
 
     @Test
+    fun testSetAllConstraintsDontTriggerSecondRun() {
+        val request = PeriodicWorkRequestBuilder<CountingTestWorker>(10, TimeUnit.DAYS)
+            .setConstraints(Constraints(requiresCharging = true)).build()
+        wm.enqueue(request).result.get()
+        val latch = CountDownLatch(1)
+        wm.workTaskExecutor.serialTaskExecutor.execute {
+            latch.await()
+        }
+        // double call to setAllConstraint. It shouldn't lead to double execution of worker.
+        // It should run once, but second time it shouldn't run because "setPeriodDelayMet" wasn't
+        // called.
+        driver.setAllConstraintsMet(request.id)
+        driver.setAllConstraintsMet(request.id)
+        latch.countDown()
+        awaitCondition(request.id) {
+            it.state == ENQUEUED && CountingTestWorker.COUNT.get() > 0
+        }
+
+        drainSerialExecutor()
+        assertThat(wm.getWorkInfoById(request.id).get().state).isEqualTo(ENQUEUED)
+        assertThat(CountingTestWorker.COUNT.get()).isEqualTo(1)
+    }
+
+    @Test
     fun testOneTimeWorkerRetry() {
         val request = OneTimeWorkRequest.from(RetryWorker::class.java)
         wm.enqueue(request).result.get()
@@ -176,11 +203,11 @@
     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
+        it.state == ENQUEUED && CountingTestWorker.COUNT.get() == 1
     }
 
     private fun awaitReenqueuedAfterRetry(id: UUID) = awaitCondition(id) {
-        it.state == WorkInfo.State.ENQUEUED && it.runAttemptCount == 1
+        it.state == ENQUEUED && it.runAttemptCount == 1
     }
 
     private fun awaitCondition(id: UUID, predicate: (WorkSpec.WorkInfoPojo) -> Boolean) {
@@ -198,4 +225,22 @@
         }
         assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue()
     }
+
+    private fun drainSerialExecutor() {
+        val latch = CountDownLatch(1)
+
+        class DrainTask(val executor: SerialExecutor) : Runnable {
+            override fun run() {
+                if (executor.hasPendingTasks()) {
+                    executor.execute(this)
+                } else {
+                    latch.countDown()
+                }
+            }
+        }
+
+        val executor = wm.workTaskExecutor.serialTaskExecutor
+        executor.execute(DrainTask(executor))
+        latch.await()
+    }
 }
\ 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 7369589..534f018 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
@@ -23,7 +23,6 @@
 import androidx.work.impl.StartStopTokens
 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
@@ -52,25 +51,19 @@
         val toSchedule = mutableMapOf<WorkSpec, InternalWorkState>()
         synchronized(lock) {
             workSpecs.forEach {
-                val state = pendingWorkStates.getOrPut(it.generationalId().workSpecId) {
-                    InternalWorkState(it, true)
-                }
-                toSchedule[it] = state.copy(isScheduled = true)
+                val oldState = pendingWorkStates[it.id] ?: InternalWorkState()
+                val state = oldState.copy(isScheduled = true)
+                pendingWorkStates[it.id] = state
+                toSchedule[it] = state
             }
         }
-        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.rewindLastEnqueueTime(originalSpec.id)
-            } else originalSpec
+        toSchedule.forEach { (spec, state) ->
             // don't even try to run a worker that WorkerWrapper won't execute anyway.
             // similar to logic in WorkerWrapper
-            if ((spec.isPeriodic || spec.isBackedOff) &&
-                (spec.calculateNextRunTime() > System.currentTimeMillis())) {
+            if (spec.isBackedOff && spec.calculateNextRunTime() > System.currentTimeMillis()) {
                 return@forEach
             }
-            scheduleInternal(spec.generationalId(), state)
+            scheduleInternal(spec, state)
         }
     }
 
@@ -95,11 +88,11 @@
         val spec = loadSpec(id)
         val state: InternalWorkState
         synchronized(lock) {
-            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
+            val oldState = pendingWorkStates[id] ?: InternalWorkState(initialDelayMet = false)
             state = oldState.copy(constraintsMet = true)
             pendingWorkStates[id] = state
         }
-        scheduleInternal(WorkGenerationalId(id, state.generation), state)
+        scheduleInternal(spec, state)
     }
 
     /**
@@ -114,12 +107,11 @@
         val state: InternalWorkState
         val spec = loadSpec(id)
         synchronized(lock) {
-            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
+            val oldState = pendingWorkStates[id] ?: InternalWorkState()
             state = oldState.copy(initialDelayMet = true)
             pendingWorkStates[id] = state
         }
-        workManagerImpl.rewindLastEnqueueTime(id)
-        scheduleInternal(WorkGenerationalId(id, state.generation), state)
+        scheduleInternal(spec, state)
     }
 
     /**
@@ -136,20 +128,21 @@
 
         val state: InternalWorkState
         synchronized(lock) {
-            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
+            val oldState = pendingWorkStates[id] ?: InternalWorkState()
             state = oldState.copy(periodDelayMet = true)
             pendingWorkStates[id] = state
         }
-        workManagerImpl.rewindLastEnqueueTime(id)
-        scheduleInternal(WorkGenerationalId(id, state.generation), state)
+        scheduleInternal(spec, state)
     }
 
-    private fun scheduleInternal(generationalId: WorkGenerationalId, state: InternalWorkState) {
-        if (state.isRunnable) {
+    private fun scheduleInternal(spec: WorkSpec, state: InternalWorkState) {
+        val generationalId = spec.generationalId()
+        if (isRunnable(spec, state)) {
             val token = synchronized(lock) {
                 pendingWorkStates.remove(generationalId.workSpecId)
                 startStopTokens.tokenFor(generationalId)
             }
+            workManagerImpl.rewindLastEnqueueTime(spec.id)
             workManagerImpl.startWork(token)
         }
     }
@@ -162,29 +155,21 @@
 }
 
 internal data class InternalWorkState(
-    val generation: Int,
-    val constraintsMet: Boolean,
-    val initialDelayMet: Boolean,
-    val periodDelayMet: Boolean,
-    val hasConstraints: Boolean,
-    val isPeriodic: Boolean,
+    val constraintsMet: Boolean = false,
+    val initialDelayMet: Boolean = false,
+    val periodDelayMet: Boolean = false,
     /* means that TestScheduler received this workrequest in schedule(....) function */
-    val isScheduled: Boolean
+    val isScheduled: Boolean = false,
 )
 
-internal val InternalWorkState.isRunnable: Boolean
-    get() = constraintsMet && initialDelayMet && periodDelayMet && isScheduled
+internal fun isRunnable(spec: WorkSpec, state: InternalWorkState): Boolean {
+    val constraints = !spec.hasConstraints() || state.constraintsMet
+    val initialDelay = (spec.initialDelay == 0L) || state.initialDelayMet
+    val periodic = if (spec.isPeriodic) (state.periodDelayMet || spec.isFirstPeriodicRun) else true
+    return state.isScheduled && constraints && periodic && initialDelay
+}
 
-internal fun InternalWorkState(spec: WorkSpec, isScheduled: Boolean): InternalWorkState =
-    InternalWorkState(
-        generation = spec.generation,
-        constraintsMet = !spec.hasConstraints(),
-        initialDelayMet = spec.initialDelay == 0L,
-        periodDelayMet = spec.periodCount == 0 && spec.runAttemptCount == 0,
-        hasConstraints = spec.hasConstraints(),
-        isPeriodic = spec.isPeriodic,
-        isScheduled = isScheduled,
-    )
+private val WorkSpec.isFirstPeriodicRun get() = periodCount == 0 && runAttemptCount == 0
 
 private fun WorkManagerImpl.rewindLastEnqueueTime(id: String): WorkSpec {
     // We need to pass check that mWorkSpec.calculateNextRunTime() < now